## 一、NULL處理語法 ### 1. COALESCE vs ISNULL - 適用標準: COALESCE() 函數是 ANSI SQL-92 標準,主流SQL語言都可以用,支援多個輸入參數。 ISNULL() 函數不是 ANSI SQL-92 標準,主要在T-SQL DB使用,僅可以輸入兩個參數。 - 程式可讀性: ISNULL如果要達到和COALESCE一樣效果,需要重疊多個ISNULL函數來實現,可讀性較差。 ``` SQL SELECT COALESCE(C1, C2, C3, C4) SELECT ISNULL(C1, ISNULL(C2, ISNULL(C3, C4))) ``` - 效能差異: 當檢查參數為查詢式時,ISNULL 效能表現會略優於COALESCE,因 COALESCE 在底層會拆解為 CASE 函數進行處理,如下範例,會執行兩次 `SELECT TOP 1 C1 FROM TABLE` 的動作,但當參數為3個以上時,因 ISNULL 需用使用巢狀架構實現,當在檢查第二個值時,才會呼叫新的 ISNULL 並重新帶入值檢查,層數越多時,效能表現會越遜於 COALESCE。 ``` SQL CASE WHEN (SELECT TOP 1 C1 FROM TABLE) IS NOT NULL THEN (SELECT TOP 1 C1 FROM TABLE) ELSE 0 END ``` - 輸出型態: COALESCE()及ISNULL()輸出的資料型態也不同,COALESCE()輸出的資料型態使用它「輸出最高優先序」的參數資料型態。ISNULL()輸出的資料型態使用它的「第一個參數」的資料型態。範例如下,ISNULL會以第一個型別為準,所以輸出格式為 VARCHAR(3),若輸出值為第二參數且長度大於第一參數時,那就可能發生截斷問題,或因無法轉換而發生轉換失敗異常;COALESCE則會以輸出值的格式為準,因此可以完整呈現輸出值的結果。 ``` SQL DECLARE @C1 VARCHAR(3) DECLARE @C2 VARCHAR(10) SET @C1 = null SET @C2 = '123456' SELECT ISNULL(@C1, @C2) AS Result1 SELECT COALESCE(@C1, @C2) AS Result2 ``` ``` Result1 ------------ 123 Result2 ------------ 123456 ``` ### 2. SQL執行範例 範例查詢資料表 ``` UserName Age Uid ------------ ---------- ------------- NULL Tom T278 Jacky 25 T765 NULL NULL T876 ``` 執行 COALESCE 和 ISNULL比較 ``` SQL SELECT COALESCE(UserName, Age, Uid) AS Result1 FROM [SampleTable] SELECT ISNULL(UserName, Age) AS Result2 FROM [SampleTable] ``` 以下為結果集: ``` Result1 ------------ Tom Jacky T876 Result2 ------------ Tom Jacky NULL ```