Можно ли вернуть несколько столбцов с помощью одного оператора case? - PullRequest
6 голосов
/ 28 июня 2011

У меня есть 4 оператора case, которые в точности совпадают с 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 ]

9 голосов
/ 28 июня 2011

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

1 голос
/ 09 октября 2013

Почему бы вам не попробовать update таблицу, используя where?В утверждении select вашего вопроса вы можете объявить Column1, Column2 и Column3 как 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')
1 голос
/ 28 июня 2011

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

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')
0 голосов
/ 28 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...