首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 流程控制函數完整指南:IF、CASE、IFNULL、NULLIF 實戰範例

     編輯:MySQL 綜合教學

IF 函數

IF(expr1, expr2, expr3):expr1 為真(非 0、非 NULL)回傳 expr2,否則回傳 expr3。

SELECT IF(1 > 2, 'yes', 'no');        -- 'no'
SELECT IF(1 < 2, 'yes', 'no');        -- 'yes'
SELECT IF(STRCMP('test','test1'),'no','yes'); -- 'no' (STRCMP 不等返回 -1 視為真)

-- 浮點數陷阱
SELECT IF(0.1, 1, 0);        -- 0 (0.1 轉整數為 0)
SELECT IF(0.1 <> 0, 1, 0);   -- 1 (正確比較)

回傳類型推斷:expr2/expr3 任一為字串 → 字串;任一為浮點 → 浮點;皆為整數 → 整數。

CASE 運算式

簡單 CASE(值比較)

CASE value
    WHEN compare_value THEN result
    [WHEN ...]
    [ELSE result]
END
SELECT CASE 1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END;  -- 'one'

搜尋 CASE(條件判斷)

CASE
    WHEN condition THEN result
    [WHEN ...]
    [ELSE result]
END
SELECT CASE WHEN 1 > 0 THEN 'true' ELSE 'false' END;  -- 'true'
SELECT CASE BINARY 'B' WHEN 'a' THEN 1 WHEN 'b' THEN 2 END;  -- NULL (區分大小寫)

IFNULL 函數

IFNULL(expr1, expr2):expr1 不為 NULL 回傳 expr1,否則回傳 expr2。

SELECT IFNULL(1, 0);        -- 1
SELECT IFNULL(NULL, 10);    -- 10
SELECT IFNULL(1/0, 10);     -- 10 (除零產生 NULL)
SELECT IFNULL(1/0, 'yes');  -- 'yes'

NULLIF 函數

NULLIF(expr1, expr2):相等回傳 NULL,否則回傳 expr1。等價 CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END。

SELECT NULLIF(1, 1);  -- NULL
SELECT NULLIF(1, 2);  -- 1

注意:不相等時 MySQL 會兩次計算 expr1,若含副作用函數需謹慎。

實戰應用場景

場景SQL 範例
性別代碼轉中文SELECT name, IF(sex=1, '男', '女') AS gender FROM users;
NULL 值預設顯示SELECT product, IFNULL(discount, 0) AS discount FROM orders;
多條件分組統計SELECT CASE WHEN score>=90 THEN '優' WHEN score>=60 THEN '及格' ELSE '不及格' END AS grade, COUNT(*) FROM exam GROUP BY grade;
避免除零錯誤SELECT total / NULLIF(count, 0) AS avg FROM stats;
動態排序ORDER BY CASE @sort WHEN 'name' THEN name WHEN 'date' THEN created_at END;

效能提示

  • 流程控制函數在 WHERE 條件中可能阻礙索引使用,盡量移至 SELECT 列表
  • 大量資料轉換建議應用層處理,減少資料庫 CPU 壓力
  • IFNULL/COALESCE 優於 CASE WHEN ... IS NULL 可讀性與效能

熟練掌握四大流程控制函數,能在 SQL 層面靈活實現業務邏輯,減少應用層往返。

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