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

MySQL IFNULL、NULLIF、ISNULL 三大空值函數深度解析與對比

     編輯:MySQL 資料庫相關知識

MySQL 提供三個處理 NULL 的函數,行為差異極大,誤用極易導致業務 Bug。本文逐一解析語法、回傳值、類型推導與實戰陷阱。

1. ISNULL(expr)

判斷是否為 NULL,回傳 1(是)或 0(否)。

SELECT ISNULL(1+1);   -- 0
SELECT ISNULL(1/0);   -- 1(1/0 結果為 NULL)
等同於 expr IS NULL,但可用於 WHERE、SELECT 列表等更多語境。

2. 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。

CREATE TABLE tmp SELECT IFNULL(1, 'test') AS test;
-- test 欄位類型變為 CHAR(4),而非 INT!
建表/建視圖時使用 IFNULL,務必顯式 CAST 鎖定類型。

3. NULLIF(expr1, expr2)

相等則回傳 NULL: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,若 expr1 為昂貴運算(子查詢/函數),效能折半。

四、對比速查表

函數用途回傳值典型場景陷阱
ISNULL判斷 NULL1/0WHERE 過濾、條件統計易與 SQL Server ISNULL(expr, val) 混淆
IFNULL空值替換expr1 或 expr2顯示預設值、COALESCE 簡化版類型推導改變欄位定義
NULLIF相等歸零NULL 或 expr1避免除零錯誤、標記特殊值雙重求值效能損耗

五、實戰最佳實踐

  • 多參數空值替換用 COALESCE(val1, val2, val3, ...)(標準 SQL、支援 N 參數)
  • IFNULL 建表時加 CAST(IFNULL(... ) AS 目標類型)
  • 除法分母用 NULLIF(divisor, 0) 防錯:SELECT 100 / NULLIF(count, 0)
  • 移植 SQL Server 代碼時:ISNULL(expr, val) → IFNULL(expr, val),ISNULL(expr) → expr IS NULL

搞清三者語義邊界,寫出健壯、可移植的 SQL。

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