IF(expr1, expr2, expr3)
-- expr1 為 TRUE(非0且非NULL)返回 expr2,否則返回 expr3
SELECT IF(score >= 60, 'pass', 'fail') FROM score;
SELECT IF(1 > 2, 2, 3); -- 3
SELECT IF(1 < 2, 'yes', 'no'); -- 'yes'
SELECT IF(STRCMP('test','test1'), 'no', 'yes'); -- 'no' (STRCMP不等返回非0視為TRUE)
CASE column_name
WHEN value1 THEN result1
WHEN value2 THEN result2
ELSE default_result
END
SELECT
CASE grade
WHEN 1 THEN 'A'
WHEN 2 THEN 'B'
WHEN 3 THEN 'C'
ELSE 'D'
END AS level
FROM test;
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE default_result
END
SELECT
CASE
WHEN score >= 90 THEN '優秀'
WHEN score >= 80 THEN '良好'
WHEN score >= 60 THEN '及格'
ELSE '不及格'
END AS evaluation
FROM scores;
關鍵區別:存儲過程中使用的是 IF 语句 和 CASE 语句,而非表達式,**必须以分號結尾**,且不能直接返回值,需通過變量或結果集輸出。
CREATE PROCEDURE test(IN a INT)
BEGIN
IF a > 1 THEN
SELECT 1;
ELSEIF a > 2 THEN
SELECT 2;
END IF; -- 缺少 ELSE 分支的語句體
END
CREATE PROCEDURE test(IN a INT)
BEGIN
IF a > 1 THEN
SELECT 1;
ELSEIF a > 2 THEN
SELECT 2;
ELSE
-- 空分支必須有語句,可用無操作賦值
SET @dummy = 1;
END IF;
END
DROP PROCEDURE IF EXISTS proc_test;
CREATE PROCEDURE proc_test(OUT rtn INT)
BEGIN
DECLARE login_id INT DEFAULT 0;
SET rtn = 1;
IF login_id = 3 THEN
SET rtn = 2;
ELSEIF login_id = 0 THEN
SET rtn = 3;
ELSE
SET rtn = 4;
END IF;
END;
SELECT * FROM products
ORDER BY
CASE @sort_by
WHEN 'price_asc' THEN price
WHEN 'price_desc' THEN -price
WHEN 'sales' THEN sales_volume
ELSE id
END;
SELECT
SUM(CASE WHEN status = 'paid' THEN amount ELSE 0 END) AS paid_total,
SUM(CASE WHEN status = 'refund' THEN amount ELSE 0 END) AS refund_total
FROM orders;
UPDATE users
SET gender = CASE
WHEN gender IN ('M','Male','男') THEN '男'
WHEN gender IN ('F','Female','女') THEN '女'
ELSE '未知'
END;
WHEN col = NULL 永不匹配,必須用 WHEN col IS NULLIF() 適合簡單雙分支;CASE 表達式支撐複雜多條件邏輯,可用於 SELECT/WHERE/ORDER BY 等各子句;存儲過程中使用 IF/CASE 语句 控制流程,注意語法結構差異。善用條件表達式可大幅簡化應用層代碼,將業務邏輯下推至數據庫層執行。