NULLIF() 函數 (SQL NULLIF() Function)

NULLIF() 函數比較兩個值,如果相等就回傳 NULL,不相等則回傳第一個值。這個函數在所有主流資料庫中都支援(MySQL、SQL Server、PostgreSQL、Oracle)。

語法

NULLIF(expression1, expression2)
  • 如果 expression1 = expression2,回傳 NULL
  • 如果 expression1 ≠ expression2,回傳 expression1

基本範例

SELECT NULLIF(10, 10);
-- 結果: NULL(因為 10 = 10)

SELECT NULLIF(10, 20);
-- 結果: 10(因為 10 ≠ 20)

SELECT NULLIF('A', 'A');
-- 結果: NULL

SELECT NULLIF('A', 'B');
-- 結果: A

實際應用範例

避免除以零錯誤

這是 NULLIF() 最常見的用途。除以零會產生錯誤,使用 NULLIF() 可以將零轉成 NULL,而任何數除以 NULL 的結果是 NULL(不會報錯):

-- 直接除可能會錯誤
SELECT total / quantity FROM orders;  -- 如果 quantity 為 0 會報錯

-- 使用 NULLIF 避免錯誤
SELECT total / NULLIF(quantity, 0) AS unit_price
FROM orders;
-- 當 quantity 為 0 時,結果為 NULL 而非錯誤

將特定值視為 NULL

有時候資料中會用特定值(如 0、空字串、'N/A')來表示「沒有資料」,可以用 NULLIF 將它們轉成 NULL:

-- 將空字串轉成 NULL
SELECT name, NULLIF(phone, '') AS phone
FROM customers;

-- 將 'N/A' 轉成 NULL
SELECT name, NULLIF(email, 'N/A') AS email
FROM customers;

-- 將 0 轉成 NULL(用於統計時排除)
SELECT AVG(NULLIF(score, 0)) AS avg_score
FROM students;

搭配 COALESCE 使用

NULLIF 常與 COALESCE 搭配使用:

-- 如果 phone 是空字串,顯示「未提供」
SELECT name, COALESCE(NULLIF(phone, ''), '未提供') AS phone
FROM customers;

執行邏輯:

  1. NULLIF(phone, '') - 如果 phone 是空字串,變成 NULL
  2. COALESCE(..., '未提供') - 如果是 NULL,顯示「未提供」

比較兩欄位

-- 找出兩個欄位值不同的記錄
SELECT *
FROM products
WHERE NULLIF(old_price, new_price) IS NOT NULL;
-- 等同於 WHERE old_price <> new_price

範例資料

假設有一個訂單資料表 orders:

order_idtotalquantity
1100010
25000
37505
SELECT 
    order_id,
    total,
    quantity,
    total / NULLIF(quantity, 0) AS unit_price
FROM orders;

結果:

order_idtotalquantityunit_price
1100010100
25000NULL
37505150