IS NULL 判斷空值
在 SQL 中,NULL 代表「沒有值」或「未知」,它與空字串 '' 或數字 0 不同。
為什麼不能用 = 判斷 NULL?
NULL 是特殊值,無法用一般的比較運算子(=、<>、<、>)判斷:
-- 錯誤:這不會返回任何結果
SELECT * FROM customers WHERE phone = NULL;
-- 正確:使用 IS NULL
SELECT * FROM customers WHERE phone IS NULL;
IS NULL 語法
查詢欄位值為 NULL 的資料:
SELECT column1, column2, ...
FROM table_name
WHERE column_name IS NULL;
IS NOT NULL 語法
查詢欄位值不為 NULL 的資料:
SELECT column1, column2, ...
FROM table_name
WHERE column_name IS NOT NULL;
範例
假設有一個 customers 資料表:
| id | name | phone |
|---|---|---|
| 1 | 張一 | 02-1234 |
| 2 | 王二 | NULL |
| 3 | 李三 | NULL |
查詢沒有電話的客戶:
SELECT * FROM customers WHERE phone IS NULL;
結果:
| id | name | phone |
|---|---|---|
| 2 | 王二 | NULL |
| 3 | 李三 | NULL |
查詢有電話的客戶:
SELECT * FROM customers WHERE phone IS NOT NULL;
結果:
| id | name | phone |
|---|---|---|
| 1 | 張一 | 02-1234 |
NULL 與函數
許多函數遇到 NULL 會返回 NULL:
SELECT 1 + NULL; -- 結果: NULL
SELECT CONCAT('A', NULL); -- MySQL 結果: NULL
可以用 COALESCE 或 IFNULL 處理 NULL:
-- 如果 phone 是 NULL,顯示「未填寫」
SELECT name, COALESCE(phone, '未填寫') AS phone
FROM customers;
NULL 與排序
不同資料庫對 NULL 的排序位置不同。可以用 COALESCE 控制:
-- 將 NULL 排在最後
SELECT * FROM customers
ORDER BY COALESCE(phone, 'ZZZZZ');