語義:expr1 非 NULL 返回 expr1,否則返回 expr2。返回類型取決於上下文(數值/字符串)。
SELECT IFNULL(1, 0); -- 1
SELECT IFNULL(NULL, 10); -- 10
SELECT IFNULL(1/0, 10); -- 10 (1/0 產生 NULL)
SELECT IFNULL(1/0, 'yes'); -- 'yes'
語義:expr1 為 TRUE(非 0 且非 NULL)返回 expr2,否則返回 expr3。
SELECT IF(1>2, 2, 3); -- 3
SELECT IF(1<2, 'yes', 'no'); -- 'yes'
SELECT IF(STRCMP('test','test1'), 'yes', 'no'); -- 'no' (相等返回 0→FALSE)
SELECT IF(0.1, 1, 0); -- 0 (0.1 轉整數為 0 → FALSE)
SELECT IF(0.1<>0, 1, 0); -- 1 (比較運算保持浮點語義)
規則:expr1 作為整數求值。測試浮點/字符串必須用比較運算(<>0、IS NOT NULL、='value')。
CASE value
WHEN compare_value THEN result
[WHEN ... THEN ...]
[ELSE result]
END
CASE
WHEN condition THEN result
[WHEN ... THEN ...]
[ELSE result]
END
SELECT CASE 1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END; -- 'one'
SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END; -- 'true'
SELECT CASE BINARY 'B' WHEN 'a' THEN 1 WHEN 'b' THEN 2 END; -- NULL (BINARY 區分大小寫)
| 場景 | 推薦 | 理由 |
|---|---|---|
| 單純「非 NULL 取值,NULL 取默認」 | IFNULL / COALESCE | 語義最清晰,COALESCE 支援多參數 |
| 布爾條件二選一 | IF | 可讀性強,注意浮點陷阱 |
| 多條件分支、區間判斷、複雜邏輯 | CASE | 標準 SQL、可嵌套、ELSE 兜底 |
| ORDER BY / GROUP BY 中動態排序分組 | CASE | 如 ORDER BY CASE status WHEN 'paid' THEN 1 WHEN 'pending' THEN 2 ELSE 3 END |
IFNULL/IF 改寫為 CASE 執行,性能無差異;COALESCE 為 ANSI 標準,IFNULL 為 MySQL 擴展,新代碼優先 COALESCE。