IF 與 CASE 在 MySQL 中雙重身份:**表達式**(可用於 SELECT/WHERE)與**流程控制語句**(僅用於存儲過程/觸發器/複合語句)。本文系統區分兩種模式,並給出存儲過程實戰模板。
IF(expr1, expr2, expr3)
-- expr1 為 TRUE(非 0 且非 NULL)返回 expr2,否則返回 expr3
SELECT *, IF(sva=1, '男', '女') AS gender FROM taname WHERE sva != '';
IFNULL(expr1, expr2):expr1 非 NULL 返回 expr1,否則 expr2。常用於空值填充:IFNULL(comm, 0)。CASE col
WHEN val1 THEN result1
WHEN val2 THEN result2
ELSE default_result
END
SELECT CASE sva WHEN 1 THEN '男' ELSE '女' END AS gender FROM taname WHERE sva != '';
CASE
WHEN cond1 THEN result1
WHEN cond2 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 student;
IF search_condition THEN
statement_list
[ELSEIF search_condition THEN
statement_list] ...
[ELSE
statement_list]
END IF;
關鍵點:
END IF 後**必須加分號**結束語句。search_condition 支持 =, <, <=, >, >=, !=, AND, OR, NOT 組合。BEGIN ... END 複合語句塊(存儲過程、函數、觸發器、事件)。DELIMITER $$
CREATE PROCEDURE `dbname`.`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 < 90 AND stu_grade >= 80 THEN
SELECT stu_grade, 'B';
ELSEIF stu_grade < 80 AND stu_grade >= 70 THEN
SELECT stu_grade, 'C';
ELSEIF stu_grade < 70 AND stu_grade >= 60 THEN
SELECT stu_grade, 'D';
ELSE
SELECT stu_grade, 'E';
END IF;
END $$
DELIMITER ;
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;
END CASE; 結束。| 場景 | 推薦 | 理由 |
|---|---|---|
| SELECT/WHERE/SET 列表中單值邏輯 | IF() / CASE 表達式 | 內聯執行,無上下文切換 |
| 存儲過程中 2-3 分支 | IF 流程控制 | 簡單直觀 |
| 存儲過程中 ≥4 分支或範圍判斷 | CASE 流程控制 | 結構清晰,易維護 |
| 空值填充 | IFNULL() / COALESCE() | 語義明確,標準 SQL |
表達式屬於「查詢語言」,流程控制屬於「程序語言」。分清身份,才能在正確位置寫出正確代碼。