在 SQL 查詢中正確處理 NULL 值至關重要。MySQL 提供 ISNULL()、IFNULL()、NULLIF() 三個函式,行為與 SQL Server 不同,本文詳細說明用法與差異。
回傳 1 表示 expr 為 NULL,否則回傳 0。
SELECT ISNULL(1+1); -- 0 SELECT ISNULL(1/0); -- 1 (除以零產生 NULL)
補充: ISNULL() 與 IS NULL 判斷邏輯相似,但前者為函式,後者為運算子。
若 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)
若 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 兩次。
| 函式 | 用途 | 回傳值 |
|---|---|---|
| ISNULL(expr) | 檢查是否為 NULL | 1 (是) / 0 (否) |
| IFNULL(expr1, expr2) | NULL 替換預設值 | expr1 或 expr2 |
| NULLIF(expr1, expr2) | 相等時轉為 NULL | NULL 或 expr1 |
IFNULL(score, 0):查詢成績單,無成績顯示 0NULLIF(user_input, ''):將空字串轉為 NULL,利於唯一索引判斷ISNULL(deleted_at):軟刪除判斷,未刪除回傳 1