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;
執行邏輯:
- NULLIF(phone, '') - 如果 phone 是空字串,變成 NULL
- COALESCE(..., '未提供') - 如果是 NULL,顯示「未提供」
比較兩欄位
-- 找出兩個欄位值不同的記錄
SELECT *
FROM products
WHERE NULLIF(old_price, new_price) IS NOT NULL;
-- 等同於 WHERE old_price <> new_price
範例資料
假設有一個訂單資料表 orders:
| order_id | total | quantity |
|---|---|---|
| 1 | 1000 | 10 |
| 2 | 500 | 0 |
| 3 | 750 | 5 |
SELECT
order_id,
total,
quantity,
total / NULLIF(quantity, 0) AS unit_price
FROM orders;
結果:
| order_id | total | quantity | unit_price |
|---|---|---|---|
| 1 | 1000 | 10 | 100 |
| 2 | 500 | 0 | NULL |
| 3 | 750 | 5 | 150 |