IF(expr1, expr2, expr3)
-- expr1 為 TRUE(非 0 且非 NULL)返回 expr2,否則返回 expr3
SELECT id, name,
IF(sex = 1, '男', '女') AS gender_cn
FROM users;
SELECT IF(0.1, 'true', 'false'); -- 返回 'false'!0.1 被轉為整數 0
SELECT IF(0.1 <> 0, 'true', 'false'); -- 返回 'true',正確比較浮點數
規則:expr1 作為整數計算;浮點/字符串務必用比較運算符。
CASE col
WHEN 'A' THEN '優秀'
WHEN 'B' THEN '良好'
ELSE '需改進'
END AS grade
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
WHEN score >= 60 THEN 'C'
ELSE 'D'
END AS level
SELECT * FROM products
ORDER BY
CASE @sort_type
WHEN 'price_asc' THEN price
WHEN 'price_desc' THEN -price
WHEN 'sales' THEN -sales
ELSE id
END;
IFNULL(expr1, expr2) -- 兩參數,expr1 非 NULL 返回 expr1,否則 expr2
COALESCE(expr1, expr2, ...) -- 多參數,返回第一個非 NULL 值(標準 SQL)
CREATE TABLE t AS SELECT IFNULL(1, 'test') AS col;
-- col 類型為 CHAR(4),以「更通用」類型為準:STRING > REAL > INTEGER
NULLIF(expr1, expr2) -- 等同 CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END
SELECT 100 / NULLIF(total, 0) AS per_capita; -- total=0 時返回 NULL 而非報錯
| expr2 / expr3 類型組合 | 結果類型 |
|---|---|
| 任一為字符串 | 字符串(若任一區分大小寫,結果區分大小寫) |
| 任一為浮點數 | 浮點數 |
| 均為整數 | 整數 |
CASE 替代嵌套 IF,可讀性更強COALESCE 標準兼容性優於 IFNULL<> 0、IS NOT NULL)避免隱式轉換N'' 或確保連接字符集一致,防亂碼