ISNULL(check_expression, replacement_value)
check_expression:任意型別,被檢查運算式。replacement_value:若為 NULL 時回傳的值,**必須能隱含轉換為 check_expression 型別**。check_expression 型別(優先順序:較高優先級型別)。
-- 數值預設值
SELECT AVG(ISNULL(Weight, 50)) FROM Production.Product;
-- 字串預設值
SELECT ISNULL(Author, 'Unknown') FROM News;
-- 日期預設值
SELECT ISNULL(EndDate, GETDATE()) FROM Tasks;
| 用法 | 用途 | 範例 |
|---|---|---|
ISNULL(expr, val) | **函數**:expr 為 NULL 時回傳 val | ISNULL(Price, 0) |
expr IS NULL | **運算子**:判斷 expr 是否為 NULL(WHERE/IF 條件) | WHERE Weight IS NULL |
expr IS NOT NULL | **運算子**:判斷 expr 不為 NULL | WHERE Weight IS NOT NULL |
❌ 錯誤:WHERE ISNULL(Weight, 0) = 0 — 會將「原本 0」與「原本 NULL 替換為 0」混淆。
✅ 正確:WHERE Weight IS NULL(找 NULL)或 WHERE Weight = 0(找 0)。
-- T-SQL 變數
DECLARE @V INT;
IF @V IS NULL PRINT 'NULL';
-- WHERE 子句
SELECT * FROM Table WHERE Column IS NULL;
SELECT * FROM Table WHERE Column IS NOT NULL;
-- ISNULL 函數提供預設值
SELECT ISNULL(@V, -1); -- 變數
SELECT ISNULL(Column, 'N/A'); -- 欄位
-- 回傳第一個非 NULL 參數(ANSI 標準,支援多參數)
COALESCE(col1, col2, col3, '預設值')
ISNULL 只接受 2 參數,COALESCE 可接受 N 參數。COALESCE 回傳型別依**所有參數中優先級最高者**;ISNULL 依第一參數。ISNULL 為內建函數,單參數替換略快;邏輯複雜時用 COALESCE 更簡潔。IS NULL / IS NOT NULL,不可用 = NULL 或 ISNULL。ISNULL(col, default)。COALESCE(col1, col2, default)。ISNULL(col, '') 避免 NULL + 'str' → NULL 導致整串變 NULL。ISNULL 是「替換 NULL」,IS NULL 是「判斷 NULL」——**一字之差,用途天差地遠**。牢記此區別,配合 COALESCE 多參數替代,即能在 T-SQL 中精準處理 NULL 值,避免「NULL 伝播」導致的邏輯錯誤與資料遺漏。