首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL IF 與 CASE 語句完全指南:表達式與流程控制雙重用法

     編輯:MySQL 資料庫相關知識

MySQL IF 與 CASE 語句完整解析

MySQL 中的 IF 與 CASE 具有雙重身份:既可作為表達式用於 SELECT 查詢,也可作為流程控制語句用於存儲程序/函數/觸發器中。本文系統梳理兩者語法、差異與最佳實踐。

一、IF 表達式 (查詢中使用)

基本語法

IF(expr1, expr2, expr3)
  • expr1:條件表達式 (TRUE 為非 0 且非 NULL)
  • expr2:條件為 TRUE 時返回
  • expr3:條件為 FALSE/NULL 時返回

返回類型取決於上下文:數值或字串。

實戰範例:性別轉換顯示

SELECT *, IF(sva=1, '男', '女') AS gender FROM taname WHERE sva != '';

IFNULL() 處理空值

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 表達式 (查詢中使用)

簡單 CASE (值比較)

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 (條件判斷) - 功能更強

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 流程控制語句 (存儲程序中)

語法結構

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

CASE case_value
    WHEN when_value THEN statement_list
    [WHEN when_value THEN statement_list] ...
    [ELSE statement_list]
END CASE;

搜尋 CASE

CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ...
    [ELSE statement_list]
END CASE;

五、核心差異與選擇指南

維度IF() 表達式CASE 表達式IF 語句CASE 語句
使用場景SELECT/WHERESELECT/WHERE存儲程序存儲程序
條件複雜度單一條件多條件/範圍複雜邏輯複雜分支
可讀性簡單時佳多條件清晰標準流程分支多時優
效能極快極快編譯執行編譯執行

最佳實踐建議

  • 查詢層:優先用 CASE 表達式 (搜尋形式),可讀性強、支援多條件、標準 SQL
  • 簡單二元邏輯:IF() 或 IFNULL() 更簡潔
  • 程序層:複雜分支用 CASE 語句,簡單條件用 IF 語句
  • 空值處理:統一用 IFNULL() 或 COALESCE() (標準 SQL)
  • 避免巢狀過深:超過 3 層考慮重構或查詢表驅動

版本兼容性提示

所有語法支援 MySQL 5.0+,存儲程序流程控制需 MySQL 5.0+,CASE 表達式搜尋形式為標準 SQL:2003,跨資料庫遷移性最佳。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved