IF(expr1, expr2, expr3):expr1 為真(非 0、非 NULL)回傳 expr2,否則回傳 expr3。
SELECT IF(1 > 2, 'yes', 'no'); -- 'no'
SELECT IF(1 < 2, 'yes', 'no'); -- 'yes'
SELECT IF(STRCMP('test','test1'),'no','yes'); -- 'no' (STRCMP 不等返回 -1 視為真)
-- 浮點數陷阱
SELECT IF(0.1, 1, 0); -- 0 (0.1 轉整數為 0)
SELECT IF(0.1 <> 0, 1, 0); -- 1 (正確比較)
回傳類型推斷:expr2/expr3 任一為字串 → 字串;任一為浮點 → 浮點;皆為整數 → 整數。
CASE value
WHEN compare_value THEN result
[WHEN ...]
[ELSE result]
END
SELECT CASE 1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END; -- 'one'
CASE
WHEN condition THEN result
[WHEN ...]
[ELSE result]
END
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 (區分大小寫)
IFNULL(expr1, expr2):expr1 不為 NULL 回傳 expr1,否則回傳 expr2。
SELECT IFNULL(1, 0); -- 1
SELECT IFNULL(NULL, 10); -- 10
SELECT IFNULL(1/0, 10); -- 10 (除零產生 NULL)
SELECT IFNULL(1/0, 'yes'); -- 'yes'
NULLIF(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,若含副作用函數需謹慎。
| 場景 | SQL 範例 |
|---|---|
| 性別代碼轉中文 | SELECT name, IF(sex=1, '男', '女') AS gender FROM users; |
| NULL 值預設顯示 | SELECT product, IFNULL(discount, 0) AS discount FROM orders; |
| 多條件分組統計 | SELECT CASE WHEN score>=90 THEN '優' WHEN score>=60 THEN '及格' ELSE '不及格' END AS grade, COUNT(*) FROM exam GROUP BY grade; |
| 避免除零錯誤 | SELECT total / NULLIF(count, 0) AS avg FROM stats; |
| 動態排序 | ORDER BY CASE @sort WHEN 'name' THEN name WHEN 'date' THEN created_at END; |
WHERE 條件中可能阻礙索引使用,盡量移至 SELECT 列表IFNULL/COALESCE 優於 CASE WHEN ... IS NULL 可讀性與效能熟練掌握四大流程控制函數,能在 SQL 層面靈活實現業務邏輯,減少應用層往返。