2016-08-08 3 views
0

Я пытаюсь сделать это в SQL:SQL: Switch/Case в где предложение

where (table1.col1 = table1.col2 
    and table2.col1 in ('01','02')) or 
     (table1.col1 <> table1.col2 
    and table2.col1 in ('03','04')) 

Я хочу знать, как это сделать с помощью Switch/Case, я хочу попробовать (но не удалось):

where table2.col1 in case 
     when table1.col1 = table1.col2 then 
      ('01','02') 
     else 
      ('03','04') 
     end 
+1

Придерживайтесь И/ИЛИ вместо случая. – jarlh

ответ

0

Что вы хотите сделать, это указать условие, основанное на том, какая часть SQL-запроса будет выполнена.

С помощью переключателя/корпуса вы можете указать условие и на основании условия, «тогда» часть выполнит какое-либо действие.

Что вы пытаетесь сделать: "then ('01', '02')" не имеет никакого смысла для SQL. Здесь, в части, вы должны указать действие/запрос, который вы хотите выполнить.

0

То, что показано, как был предпринята попытка в 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   
     )              
Смежные вопросы