ISNULL 核心語法
ISNULL(check_expression, replacement_value)
check_expression:被檢查表達式,任意類型。
replacement_value:check_expression 為 NULL 時返回的值,**必須隱式轉換為與 check_expression 相同類型**。
- 返回類型 =
check_expression 的類型(優先級較高類型勝出)。
經典示例
1. 配合聚合函數處理 NULL
-- 將 price 為 NULL 的書按 $10 計算平均價
SELECT AVG(ISNULL(price, 10.00)) FROM titles;
2. 顯示層面替換 NULL
SELECT SUBSTRING(title,1,15) AS Title, type AS Type,
ISNULL(price, 0.00) AS Price
FROM titles;
跨數據庫 NULL 處理函數對比
| 數據庫 | 函數 | 語法 | 備註 |
| SQL Server / MS Access | ISNULL(expr, val) | 兩參數,類型跟隨第一參數 | 專有 |
| Oracle | NVL(expr, val) | 兩參數,類型跟隨第一參數 | 標準 SQL 擴展 |
| MySQL | IFNULL(expr, val) | 兩參數,類型跟隨第一參數 | 同 ISNULL |
| 標準 SQL / PostgreSQL / SQLite / SQL Server | COALESCE(expr1, expr2, ...) | 多參數,返回第一個非 NULL | **ANSI 標準,推薦跨庫專案優先使用** |
實戰陷阱:類型優先級導致的截斷/溢出
-- 陷阱:replacement_value 類型優先級高,導致 check_expression 隱式轉換溢出
DECLARE @v VARCHAR(3) = NULL;
SELECT ISNULL(@v, 12345); -- 錯誤:VARCHAR(3) 無法容納 12345
-- 正確:顯式轉換 replacement_value
SELECT ISNULL(@v, CAST(12345 AS VARCHAR(10)));
ISNULL vs COALESCE 選擇指南
| 場景 | 推薦 | 理由 |
| 僅兩參數、SQL Server 專用項目 | ISNULL | 語法簡短、解析略快、類型規則明確 |
| 跨庫遷移、可能擴展多參數、需 ANSI 標準 | COALESCE | 標準兼容、支持 N 參數、類型推導按優先級 |
| CASE 表達式替代(如多條件分支) | COALESCE | COALESCE(a,b,c) 等價於 CASE WHEN a IS NOT NULL THEN a WHEN b IS NOT NULL THEN b ELSE c END |
性能微差異
- ISNULL 為內建函數,編譯時直接內聯,極高頻調用(百萬級/秒)略快 ~1-2%。
- COALESCE 會被解析器重寫為 CASE 表達式,增加極微小開銷,可忽略不計。
結語
ISNULL 是 SQL Server 專用的「雙參數 NULL 替換」,簡潔高效;COALESCE 是「多參數、跨平台、標準化」的通用選擇。新項目建議統一 COALESCE,舊代碼維護沿用 ISNULL 即可,無需強行重構。