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

Sql 是否可以使用一个case语句返回多个列?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有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 (

我有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]

用更少的代码可以做到这一点吗?

我认为在严格的SQL中不可能做到这一点。某些DB引擎可能支持将其作为扩展。你也许可以通过其他机制完成同样的功能,不过。。。可能是加入或联合。

对于您给出的示例,我不会尝试进行任何更改。如果您的测试(当时……)涉及更多的计算,或者如果它经常重复,您可以考虑设置子查询来评估它。但是只要有少量的重复,为什么还要麻烦呢?您拥有的代码易于阅读,执行成本也不高。

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

为什么不尝试使用
where
更新表?在问题的
选择
语句中,您可以将
第1列
第2列
第3列
声明为
,并使用两个
更新
语句更改值

根据相同的
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')

如果您试图用逗号分隔一个case中的任何内容,Sql Server将失败,因此他很可能被3个case语句+1所困扰,这似乎是解决此特定问题的最佳方法,我将使用UNION ALL来替代它以获得更好的性能