Можно ли вернуть несколько столбцов с помощью оператора 1 case?

у меня есть 4 заявления случая, которые точно такие же CASE критерии, но все они имеют разное THEN/ELSE заявления.

можно ли сделать все это за один раз, или мне нужно отделить их все и скопировать и вставить код несколько раз?

,CASE WHEN lm.Id IN ('1','2','3') THEN lm.name ELSE lm.Desc END AS [Column1]
,CASE WHEN lm.Id IN ('1','2','3') THEN '3' ELSE '1' END AS [Column2]
,CASE WHEN lm.Id IN ('1','2','3') THEN 'True' ELSE 'False' END AS [Column3]

можно ли сделать это с меньше кода?

4 ответов


Я не думаю, что это возможно в строгом SQL. Некоторые СУБД могут поддерживать его как расширение. Вероятно, вы могли бы функционально выполнить то же самое через какой-то другой механизм... возможно, с объединением или союзом.


предлагаю UNIONing ваши наборы результатов. Это не даст вам меньше строк кода, но, возможно, более читабельным.

SELECT [name], '3', 'True'
From Mytable WHERE ID IN ('1','2','3')
UNION 
SELECT [desc], '1', 'False'
From Mytable WHERE ID NOT IN ('1','2','3')

почему бы вам не попробовать update таблицы с помощью where? В select заявление вашего вопроса Вы можете объявить Column1, Column2 и Column3 as NULL и update операторы изменяют значения.

С "только" три столбца в зависимости от того же case оператор код ниже не экономит много ввода (возможно, время выполнения..?) но это удобно, когда у вас больше 3...

UPDATE MyTable
      SET Column1 = lm.name,
          Column2 = '3',
          Column3 = 'True'
WHERE lm.Id IN ('1','2','3')

UPDATE MyTable
      SET Column1 = lm.Desc,
          Column2 = '1',
          Column3 = 'False'
WHERE lm.Id NOT IN ('1','2','3')

для примера, который вы даете, я бы не пытался внести какие-либо изменения. Если ваш тест ( когда ... Затем) включало гораздо больше вычислений, или если это повторялось намного чаще, вы могли бы рассмотреть возможность создания подзапроса для его оценки. Но с небольшим количеством повторений, зачем беспокоиться? Код, который у вас есть, легко читать и не дорого выполнять.