Проверка входного параметра для «необязательного» параметра - PullRequest
0 голосов
/ 30 апреля 2020

Я пишу запрос SQL и застрял в предложении WHERE. Что я пытаюсь сделать с последней строкой, так это сказать: если для параметра не было введено никакого значения, используйте аргумент * (все значения).

WHERE
(REGEXP_INSTR('%params', '///') > 0 AND REGEXP_LIKE(column1,'%params'))
OR (REGEXP_INSTR('%params', '///') = 0 AND REGEXP_LIKE('%params'))
OR (REGEXP_INSTR('%params', '') = 1 

Это последняя строка, которую я имею проблема с:

OR (REGEXP_INSTR('%params', '') = 1 

Все параметры времени выполнения должны иметь значение, поэтому оно не может быть значением NULL.

Я не уверен, сработает ли '' или может проявить нежелательное поведение.

1 Ответ

0 голосов
/ 30 апреля 2020

Oracle трактует '' как NULL, поэтому вы не можете делать то, что хотите. Вам нужно прямое сравнение с NULL:

WHERE (REGEXP_INSTR('%params', '///') > 0 AND REGEXP_LIKE(column1,'%params')) OR
      (REGEXP_INSTR('%params', '///') = 0 AND REGEXP_LIKE('%params')) OR
      ('%params' IS NULL)

Даже если '', а не NULL, поиск пустой строки в другой строке на самом деле не имеет смысла.

Вы также можете использовать LENGTH(), но вы должны быть осторожны, потому что на самом деле он возвращает NULL, а не 0.

...