是否可以使用1个case语句返回多个列?

时间:2011-06-27 20:51:12

标签: sql sql-server tsql

我有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 个答案:

答案 0 :(得分:9)

我不认为这在严格的SQL中是可行的。某些数据库引擎可能会支持它作为扩展。你可以通过其他机制在功能上完成同样的事情,但是......可能有一个JOIN或一个UNION。

答案 1 :(得分:1)

建议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')

答案 2 :(得分:1)

为什么不使用update尝试where表格?在问题的select声明中,您可以将Column1Column2Column3声明为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')

答案 3 :(得分:0)

对于您给出的示例,我不会尝试进行任何更改。如果你的测试(当时......那么)涉及更多的计算,或者如果它经常重复,你可以考虑设置一个子查询来评估它。但只有少量的重复,为什么要这么麻烦?您拥有的代码易于阅读,执行起来并不昂贵。