MySQL 中的 IF 與 CASE 具有雙重身份:既可作為表達式用於 SELECT 查詢,也可作為流程控制語句用於存儲程序/函數/觸發器中。本文系統梳理兩者語法、差異與最佳實踐。
IF(expr1, expr2, expr3)
expr1:條件表達式 (TRUE 為非 0 且非 NULL)expr2:條件為 TRUE 時返回expr3:條件為 FALSE/NULL 時返回返回類型取決於上下文:數值或字串。
SELECT *, IF(sva=1, '男', '女') AS gender FROM taname WHERE sva != '';
IFNULL(expr1, expr2) -- 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
CASE column WHEN value1 THEN result1
WHEN value2 THEN result2
ELSE default_result END
範例:
SELECT CASE sva WHEN 1 THEN '男' ELSE '女' END AS gender FROM taname;
CASE WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE default_result END
範例: 成績等級判定
SELECT CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
WHEN score >= 70 THEN 'C'
WHEN score >= 60 THEN 'D'
ELSE 'E' END AS grade
FROM scores;
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF;
關鍵點: END IF 後必須加分號,這與其他語句 (CASE、LOOP 等) 一致。
CREATE PROCEDURE proc_getGrade(
IN stu_no VARCHAR(20),
IN cour_no VARCHAR(10)
)
BEGIN
DECLARE stu_grade FLOAT;
SELECT grade INTO stu_grade
FROM grade
WHERE student_no = stu_no AND course_no = cour_no;
IF stu_grade >= 90 THEN
SELECT stu_grade, 'A';
ELSEIF stu_grade >= 80 THEN
SELECT stu_grade, 'B';
ELSEIF stu_grade >= 70 THEN
SELECT stu_grade, 'C';
ELSEIF stu_grade >= 60 THEN
SELECT stu_grade, 'D';
ELSE
SELECT stu_grade, 'E';
END IF;
END
CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END CASE;
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE;
| 維度 | IF() 表達式 | CASE 表達式 | IF 語句 | CASE 語句 |
|---|---|---|---|---|
| 使用場景 | SELECT/WHERE | SELECT/WHERE | 存儲程序 | 存儲程序 |
| 條件複雜度 | 單一條件 | 多條件/範圍 | 複雜邏輯 | 複雜分支 |
| 可讀性 | 簡單時佳 | 多條件清晰 | 標準流程 | 分支多時優 |
| 效能 | 極快 | 極快 | 編譯執行 | 編譯執行 |
所有語法支援 MySQL 5.0+,存儲程序流程控制需 MySQL 5.0+,CASE 表達式搜尋形式為標準 SQL:2003,跨資料庫遷移性最佳。