2011-06-27 86 views
6

我有4個case語句與CASE條件完全相同,但它們都有不同的THEN/ELSE語句。是否可以使用1個case語句返回多個列?

是否有可能在一個這樣做,還是我需要將這些全部分開並複製並粘貼代碼多次?

,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] 

是否可以用較少的代碼做到這一點?

回答

9

我不認爲這是嚴格的SQL中可能的。一些數據庫引擎可能會支持它作爲擴展。通過其他一些機制,你或許可以在功能上完成相同的事情,儘管......可能有JOIN或UNION。

+0

如果你試圖在逗號分隔的情況下嘗試分離任何東西,Sql Server將會失敗,所以很可能他被困在3個case語句中 – Limey

0

對於你給的例子,我不會嘗試做任何改變。如果你的測試(WHEN ... THEN)涉及更多的計算,或者如果它經常重複,你可以考慮設置一個子查詢來評估它。但只有少量的重複,爲什麼要麻煩?您擁有的代碼易於閱讀,而且執行起來並不昂貴。

1

建議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') 
+0

+1似乎是解決這個特定問題的最佳方法,我會使用UNION ALL來改善性能 –

1

你爲什麼不嘗試update表使用where?在您的問題的select聲明中,您可以聲明Column1,Column2Column3NULL,並用兩個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')