Можно ли вернуть несколько столбцов с помощью оператора 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. Некоторые СУБД могут поддерживать его как расширение. Вероятно, вы могли бы функционально выполнить то же самое через какой-то другой механизм... возможно, с объединением или союзом.
предлагаю UNION
ing ваши наборы результатов. Это не даст вам меньше строк кода, но, возможно, более читабельным.
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')
для примера, который вы даете, я бы не пытался внести какие-либо изменения. Если ваш тест ( когда ... Затем) включало гораздо больше вычислений, или если это повторялось намного чаще, вы могли бы рассмотреть возможность создания подзапроса для его оценки. Но с небольшим количеством повторений, зачем беспокоиться? Код, который у вас есть, легко читать и не дорого выполнять.