SQL CASE с пользовательскими параметрами - PullRequest
2 голосов
/ 13 марта 2019

Мне было поручено создать несколько отчетов, которые позволят пользователю:

  1. Ничего не вводить и получать все связанные данные
  2. Фильтровать один или несколько фрагментов данных (разделенных запятыми))

Я думал, что для этого было бы просто использовать оператор CASE, поэтому в WHERE я сделал следующее:

SomeTable.SomeField IN (CASE 

WHEN :P_ITEM_CLAUSE IS NULL THEN SomeTable.SomeField

WHEN INSTR(:P_ITEM_CLAUSE,',') > 0 THEN ''''||TO_CHAR(replace(:P_ITEM_CLAUSE,',', ''''||', '||''''))||''''

ELSE TO_CHAR(:P_ITEM_CLAUSE) END) 

Первое и третье условия работают, как и ожидалось, новторое условие не возвращает данных.Я также протестировал второе условие отдельно, используя DUAL, и смог получить все значения, которые я ввел в параметр.Это сервер Oracle.

1 Ответ

0 голосов
/ 13 марта 2019

Вы можете использовать like. Как то так:

where :P_ITEM_CLAUSE is null or
      ',' || :P_ITEM_CLAUSE  || ',' like '%,' || SomeTable.SomeField || ',%'

Обратите внимание, что полученный запрос не сможет использовать индекс для SomeField.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...