萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL IF / CASE 條件表達式完整指南:從基礎查詢到存儲過程實戰

一、IF() 函數:單條件三元運算

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 表達式:多條件分支

1. 簡單 CASE(值比較)

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;

2. 搜索 CASE(條件表達式)

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;

四、實戰應用模式

1. 動態排序

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;

2. 條件聚合

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;

3. 數據清洗標準化

UPDATE users
SET gender = CASE 
    WHEN gender IN ('M','Male','男') THEN '男'
    WHEN gender IN ('F','Female','女') THEN '女'
    ELSE '未知'
END;

五、常見坑點提示

  • 返回類型一致性:CASE 各分支返回類型應兼容,否則隱式轉換可能導致精度損失
  • NULL 判斷:WHEN col = NULL 永不匹配,必須用 WHEN col IS NULL
  • 短路求值:MySQL 按順序評估 WHEN,命中即停止,將高頻條件前置
  • 存儲過程中不可直接 RETURN 值:需通過 OUT/INOUT 參數或 SELECT 結果集返回

總結

IF() 適合簡單雙分支;CASE 表達式支撐複雜多條件邏輯,可用於 SELECT/WHERE/ORDER BY 等各子句;存儲過程中使用 IF/CASE 语句 控制流程,注意語法結構差異。善用條件表達式可大幅簡化應用層代碼,將業務邏輯下推至數據庫層執行。

copyright © 萬盛學電腦網 all rights reserved