LEFT JOIN 時,右表無匹配行會產生 NULL。前端顯示或後續運算常需將 NULL 轉為預設值(如 0、空字串、'N/A')。
| 函數 | 語法 | 回傳 | 支援版本 |
|---|---|---|---|
IFNULL | IFNULL(expr, default) | expr 非 NULL 時回傳 expr,否則 default | 所有版本 |
COALESCE | COALESCE(expr1, expr2, ...) | 回傳第一個非 NULL 參數 | 所有版本(標準 SQL) |
IF | IF(condition, true_val, false_val) | 條件判斷 | 所有版本 |
CASE | CASE WHEN ... THEN ... ELSE ... END | 多條件分支 | 所有版本(標準 SQL) |
SELECT
u.`id`,
u.`user_name`,
u.`role`,
u.`adm_regionid`,
-- 單欄位預設值
IFNULL(r.`region_name`, '未分配') AS `region_name`,
-- 多欄位優先級:region_name > region_code > '未知'
COALESCE(r.`region_name`, r.`region_code`, '未知') AS `region_display`,
-- 數值欄位預設 0
IFNULL(r.`population`, 0) AS `population`,
u.`create_time`
FROM `userinfo` u
LEFT JOIN `region` r ON u.`adm_regionid` = r.`id`;
SELECT
`category`,
COALESCE(SUM(`amount`), 0) AS `total_amount`,
COALESCE(COUNT(`id`), 0) AS `order_count`
FROM `orders`
GROUP BY `category`;
UPDATE `products` SET `stock` = IFNULL(`stock`, 0) + 10 WHERE `id` = 123;
SELECT
`name`,
CASE
WHEN `status` = 1 THEN '啟用'
WHEN `status` = 2 THEN '停用'
ELSE '未知'
END AS `status_label`
FROM `users`;
IFNULL/COALESCE 在查詢層處理,不影響索引使用。WHERE 條件中對欄位包裹函數(如 WHERE IFNULL(col,0)=0),會導致全表掃描。改寫為 WHERE col IS NULL OR col = 0。善用 IFNULL(雙參數簡潔)與 COALESCE(多參數彈性、標準 SQL),能在查詢層優雅解決 NULL 顯示問題,提升程式碼可讀性與前端相容性。記住:查詢層處理預設值,條件層避免函數包裹。