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

MySQL 條件判斷函數全解析:IFNULL、IF、CASE 實戰指南

     編輯:MySQL 綜合教學

三大條件判斷函數核心差異

MySQL 提供 IFNULL()、IF()、CASE 三種條件邏輯函數,雖然功能有重疊,但適用場景與行為細節差異巨大。掌握它們的精確語義,能寫出更簡潔、高效且無 Bug 的 SQL。

IFNULL(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' (回傳類型隨上下文)

關鍵特性:

  • 僅判斷 expr1 IS NULL,0、''、FALSE 皆視為非 NULL
  • 回傳類型取決於使用上下文(數值/字串語境)
  • 等同於標準 SQL 的 COALESCE(expr1, expr2),但 COALESCE 支援多參數,建議優先使用

IF(expr1, expr2, expr3) — 三元運算子

SELECT IF(1>2, 2, 3);                    -- 3
SELECT IF(1<2, 'yes', 'no');             -- 'yes'
SELECT IF(STRCMP('test','test1'),'yes','no'); -- 'no' (STRCMP 相等回傳 0)

⚠️ 致命陷阱:數值語境下的隱式轉換

SELECT IF(0.1, 1, 0);        -- 0 !!! 因為 0.1 轉整數變 0,視為 FALSE
SELECT IF(0.1 <> 0, 1, 0);   -- 1 正確:明確比較後再判斷

鐵律:expr1 在數值語境下會被轉為整數再判斷真偽。測試浮點數或字串時,必須使用比較運算子(<>0、IS NOT NULL、='value' 等)產生布林結果。

CASE 運算式 — 複雜邏輯的瑞士刀

簡單 CASE(值比較)

SELECT CASE 1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END;  -- 'one'

搜尋 CASE(條件判斷)

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 (BINARY 區分大小寫)
SELECT CASE 'B' WHEN 'a' THEN 1 WHEN 'b' THEN 2 END;         -- 2 (預設不區分大小寫)

實戰選型決策樹

  1. 單純替換 NULL → COALESCE(col, default_val)(標準、多參數、可讀性最佳)
  2. 單一條件二選一 → IF(condition, true_val, false_val)(簡潔,但記得比較運算子)
  3. 多條件分支/複雜邏輯 → CASE WHEN ... THEN ... ELSE ... END(結構清晰、支援巢狀、標準 SQL)
  4. 需大小寫敏感比較 → CASE BINARY ... 或 IF(BINARY col='val', ...)

效能與最佳實踐

  • 三者效能差異微乎其微,優先考慮可讀性與正確性
  • 避免在 WHERE 條件中對欄位使用函數(如 WHERE IFNULL(col,0)=1),改寫為 WHERE col=1 OR col IS NULL 以利用索引
  • CASE 運算式在 SELECT 列表中可被優化器常數摺疊,條件為常數時極快
  • 資料清洗/ETL 場景大量使用時,考慮在應用層處理以降低資料庫負載

條件判斷看似簡單,細節決定成敗。尤其 IF() 的隱式整數轉換陷阱,是無數開發者深夜除錯的元兇——現在你知道了,就不會再踩坑。

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