То, что показано, как был предпринята попытка в OP, как эффект для СЛУЧАЯ выражения, является неправильным использованием. Выражение CASE влияет на результат , из которого ('01', '02') не является выражением, которое может быть оценено. Однако значения -пункт будет действительным результатом
Вариант DB2, на котором я проверил следующее ИНЕКЕ дал ошибку [SQLCODE: -811 «результат больше, чем одна строка»], что я не ожидал; то есть для предиката IN, должно быть приемлемо более одной строки. Возможно, это кодирование может быть действительным и функциональным при использовании на какой-то другой вариант \ уровне DB2 ?:
where table2.col1 IN (case when table1.col1 = table1.col2
then (values('01'), ('02')) end)
or table2.col1 IN (case when table1.col1 <> table1.col2
then (values('03'), ('04')) end)
Следующая ИНЕКЕ сделал работу, как я ожидал; что я предположил, что это эффективный эквивалент вышеприведенного предложения WHERE, использующего выражение CASE. Конечно, весьма заметно, это делает не использовать любую СЛУЧАЙ логику:
where table2.col1 in (select c2
from (values('01'), ('02')) as s (c2)
where table1.col1 = table1.col2 )
or table2.col1 in (select c2
from (values('03'), ('04')) as s (c2)
where table1.col1 <> table1.col2 )
Я не уверен, что цель с желанием использовать выражение CASE, но FWIW, я предлагаю дополнительно следующее, что хотя и почти то же, что и в OP, может иметь некоторое значение в обзоре. Предложение WHERE использует выражение CASE для выполнения той же логики, что и предложение WHERE из OP; первый предикат IN ANDed ко второму предикату в круглых скобках является необязательным, но делает явным, какие значения допустимы для table2.col1, вне любой логики OR, предполагая увеличение потенциала для оптимизатора к лучшему \ скорее узнайте, что ограничение на данные:
where table2.col1 in ('01', '02', '03', '04')
and ( table1.col1 = case when table2.col1 in ('01','02')
then table1.col2 end
or table1.col1 <> case when table2.col1 in ('03','04')
then table1.col2 end
)
Придерживайтесь И/ИЛИ вместо случая. – jarlh