---
# System prepended metadata

title: SQL 相似語法比較
tags: [MSSQL]

---

## 一、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
``` 
