SELECT 1 = NULL, 1 <> NULL, 1 < NULL, 1 > NULL;
-- 結果全為 NULL,而非 true/false
正確判斷:IS NULL / IS NOT NULL。
| 函數 | 語法 | 用途 | 返回類型 |
|---|---|---|---|
| IFNULL | IFNULL(expr1, expr2) | expr1 非 NULL 返回 expr1,否則 expr2 | 數值/字符串,視上下文 |
| IF | IF(expr1, expr2, expr3) | expr1 為真(非0/非NULL)返回 expr2,否則 expr3 | 數值/字符串,視上下文 |
| CASE | 見下文 | 多條件分支、類似 switch | 各分支類型兼容 |
-- 錯誤:NULL 不參與 <> 比較
SELECT * FROM qorder WHERE status <> 'cancel';
-- 正確:IFNULL 將 NULL 轉為默認值再比較
SELECT * FROM qorder WHERE IFNULL(status, 'pending') <> 'cancel';
-- 等價 IF 寫法
SELECT * FROM qorder WHERE IF(status IS NULL, 'pending', status) <> 'cancel';
SELECT IFNULL(1, 0); -- 1
SELECT IFNULL(0, 10); -- 0
SELECT IFNULL(1/0, 10); -- 10.0000 (除零返回 NULL)
SELECT IFNULL(1/0, 'yes'); -- 'yes'
SELECT IF(1>2, 2, 3); -- 3
SELECT IF(1<2, 'yes', 'no'); -- 'yes'
CASE value
WHEN compare_value THEN result
[WHEN ... THEN ...]
[ELSE result]
END
SELECT CASE 1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END; -- 'one'
SELECT CASE BINARY 'B' WHEN 'a' THEN 1 WHEN 'b' THEN 2 END; -- NULL (區分大小寫)
CASE
WHEN condition THEN result
[WHEN ... THEN ...]
[ELSE result]
END
SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END; -- 'true'
-- 性別顯示轉換
SELECT id, username,
CASE gender WHEN 1 THEN '男' WHEN 2 THEN '女' ELSE '未知' END AS gender_name
FROM t_people;
-- 圖書分類展開
SELECT b.id, b.book_name,
CASE b.type WHEN 1 THEN '計算機' WHEN 2 THEN '會計' ELSE '其他' END AS category
FROM book b;
-- 復雜業務邏輯
SELECT *,
CASE
WHEN score >= 90 THEN '優秀'
WHEN score >= 75 THEN '良好'
WHEN score >= 60 THEN '及格'
ELSE '不及格'
END AS grade
FROM exam;
IS NULL/IS NOT NULL,必要時包裹 IFNULL