SQL SERVER 多欄位不為空COALESCE用法
阿新 • • 發佈:2019-02-16
有時候我們需要對多個欄位進行非空判斷,顯示幾個欄位中不為空(最前邊)的那個,欄位少的時候,我們可以使用CASE WHEN做判斷,但是多的時候寫起來就比較麻煩了,這時候我們可以用COALESCE,測試資料:
--測試資料 if not object_id(N'Tempdb..#T1') is null drop table #T1 Go Create table #T1([Name] nvarchar(22),[Subject] nvarchar(22),[Score] int) Insert #T1 select N'李四',N'語文',60 union all select N'李四',N'數學',70 union all select N'李四',N'英語',80 GO if not object_id(N'Tempdb..#T2') is null drop table #T2 Go Create table #T2([Name] nvarchar(22),[Subject] nvarchar(22),[Score] int) Insert #T2 select N'張三',N'語文',90 union all select N'張三',N'數學',80 union all select N'張三',N'物理',70 GO if not object_id(N'Tempdb..#T3') is null drop table #T3 Go Create table #T3([Name] nvarchar(22),[Subject] nvarchar(22),[Score] int) Insert #T3 select N'王五',N'語文',90 union all select N'王五',N'數學',80 union all select N'王五',N'歷史',70 Go --測試資料結束
比如我們要顯示所有學科每人的得分,三張成績表中的學科都不太一樣,我們要顯示所有學科的,所以需要FULL JOIN 連結,之前用CASE WHEN判斷學科是否為空,寫法如下:
SELECT CASE WHEN #T1.Subject IS NOT NULL THEN #T1.Subject WHEN #T2.Subject IS NOT NULL THEN #T2.Subject ELSE #T3.Subject END AS Subject , #T1.Name , #T1.Score , #T2.Name , #T2.Score , #T3.Name , #T3.Score FROM #T1 FULL JOIN #T2 ON #T2.Subject = #T1.Subject FULL JOIN #T3 ON #T2.Subject = #T3.Subject
結果如下:
但是我們看到CASE WHEN那裡寫起來比較麻煩,判斷較多,欄位少的時候可能沒問題,但是如果有十幾二十個欄位就不好判斷了,所以這時候我們可以使用COALESCE來做處理:
SELECT COALESCE(#T1.Subject, #T2.Subject, #T3.Subject) AS Subject , #T1.Name , #T1.Score , #T2.Name , #T2.Score, #T3.Name , #T3.Score FROM #T1 FULL JOIN #T2 ON #T2.Subject = #T1.Subject FULL JOIN #T3 ON #T2.Subject = #T3.Subject
結果如下:
我們可以看到和CASE WHEN判斷 的結果一樣,但是寫法比較簡潔明瞭。當然COALESCE也可以應用到其他地方比如代替ISNULL判斷等,根據實際情況應用。