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

MySQL 條件函數全解析:IFNULL、IF、CASE WHEN 則 ELSE END 差異與最佳實踐

     編輯:MySQL 綜合教學

1. IFNULL(expr1, expr2)

語義:expr1 非 NULL 返回 expr1,否則返回 expr2。返回類型取決於上下文(數值/字符串)。

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

2. IF(expr1, expr2, expr3)

語義:expr1 為 TRUE(非 0 且非 NULL)返回 expr2,否則返回 expr3。

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

隱式類型轉換陷阱

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')。

3. CASE 表達式(兩種語法)

簡單 CASE(值比較)

CASE value
  WHEN compare_value THEN result
  [WHEN ... THEN ...]
  [ELSE result]
END

搜索 CASE(條件判斷)

CASE
  WHEN condition THEN result
  [WHEN ... THEN ...]
  [ELSE result]
END

示例

SELECT CASE 1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END;  -- 'one'
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 區分大小寫)

三者選型指南

場景推薦理由
單純「非 NULL 取值,NULL 取默認」IFNULL / COALESCE語義最清晰,COALESCE 支援多參數
布爾條件二選一IF可讀性強,注意浮點陷阱
多條件分支、區間判斷、複雜邏輯CASE標準 SQL、可嵌套、ELSE 兜底
ORDER BY / GROUP BY 中動態排序分組CASE如 ORDER BY CASE status WHEN 'paid' THEN 1 WHEN 'pending' THEN 2 ELSE 3 END

效能與兼容性

  • 三者均為標準 SQL,跨數據庫可移植;
  • MySQL 內部將 IFNULL/IF 改寫為 CASE 執行,性能無差異;
  • COALESCE 為 ANSI 標準,IFNULL 為 MySQL 擴展,新代碼優先 COALESCE。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved