MySQL 提供三個處理 NULL 的函數,行為差異極大,誤用極易導致業務 Bug。本文逐一解析語法、回傳值、類型推導與實戰陷阱。
判斷是否為 NULL,回傳 1(是)或 0(否)。
SELECT ISNULL(1+1); -- 0
SELECT ISNULL(1/0); -- 1(1/0 結果為 NULL)
等同於expr IS NULL,但可用於WHERE、SELECT列表等更多語境。
空值替換:expr1 非 NULL 回傳 expr1,否則回傳 expr2。
SELECT IFNULL(1, 0); -- 1
SELECT IFNULL(NULL, 10); -- 10
SELECT IFNULL(1/0, 10); -- 10
SELECT IFNULL(1/0, 'yes'); -- 'yes'
回傳類型為兩表達式中「較通用」者,優先序:STRING > REAL > INTEGER。
CREATE TABLE tmp SELECT IFNULL(1, 'test') AS test;
-- test 欄位類型變為 CHAR(4),而非 INT!
建表/建視圖時使用 IFNULL,務必顯式 CAST 鎖定類型。
相等則回傳 NULL:expr1 = expr2 回傳 NULL,否則回傳 expr1。等同 CASE WHEN expr1=expr2 THEN NULL ELSE expr1 END。
SELECT NULLIF(1, 1); -- NULL
SELECT NULLIF(1, 2); -- 1
參數不相等時,MySQL 會兩次求值 expr1,若 expr1 為昂貴運算(子查詢/函數),效能折半。
| 函數 | 用途 | 回傳值 | 典型場景 | 陷阱 |
|---|---|---|---|---|
| ISNULL | 判斷 NULL | 1/0 | WHERE 過濾、條件統計 | 易與 SQL Server ISNULL(expr, val) 混淆 |
| IFNULL | 空值替換 | expr1 或 expr2 | 顯示預設值、COALESCE 簡化版 | 類型推導改變欄位定義 |
| NULLIF | 相等歸零 | NULL 或 expr1 | 避免除零錯誤、標記特殊值 | 雙重求值效能損耗 |
COALESCE(val1, val2, val3, ...)(標準 SQL、支援 N 參數)IFNULL 建表時加 CAST(IFNULL(... ) AS 目標類型)NULLIF(divisor, 0) 防錯:SELECT 100 / NULLIF(count, 0)ISNULL(expr, val) → IFNULL(expr, val),ISNULL(expr) → expr IS NULL搞清三者語義邊界,寫出健壯、可移植的 SQL。