Мне было поручено создать несколько отчетов, которые позволят пользователю:
- Ничего не вводить и получать все связанные данные
- Фильтровать один или несколько фрагментов данных (разделенных запятыми))
Я думал, что для этого было бы просто использовать оператор 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.