1. 程式人生 > >SQL SERVER 多欄位不為空COALESCE用法

SQL SERVER 多欄位不為空COALESCE用法

        有時候我們需要對多個欄位進行非空判斷,顯示幾個欄位中不為空(最前邊)的那個,欄位少的時候,我們可以使用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判斷等,根據實際情況應用。