左連接查詢時,右表無匹配導致目標列顯示 NULL,前端直接渲染會出現「null」字樣或報錯,需在 SQL 層統一轉為友好默認值。
SELECT
ui.id, ui.user_name, ui.role, ui.adm_regionid,
r.region_name,
ui.create_time
FROM userinfo ui
LEFT JOIN region r ON ui.adm_regionid = r.id;
結果示例:
id | user_name | role | adm_regionid | region_name | create_time
---|-----------|------|--------------|-------------|------------
1 | alice | 1 | 100 | 北京市 | 2023-01-01
2 | bob | 2 | 999 | NULL | 2023-01-02
SELECT
ui.id, ui.user_name, ui.role, ui.adm_regionid,
IFNULL(r.region_name, '未知區域') AS region_name,
ui.create_time
FROM userinfo ui
LEFT JOIN region r ON ui.adm_regionid = r.id;
結果:
... | region_name
... | 北京市
... | 未知區域
IFNULL(expr1, expr2)
-- 如果 expr1 不為 NULL,返回 expr1;否則返回 expr2。
-- 等價於:CASE WHEN expr1 IS NOT NULL THEN expr1 ELSE expr2 END
SELECT IFNULL(sales_amount, 0) AS sales FROM orders;
SELECT IFNULL(nickname, '') AS nick FROM user;
-- 先試 nickname,再試 user_name,最後給 '匿名'
SELECT COALESCE(nickname, user_name, '匿名') AS display_name FROM user;
SELECT
COUNT(*) AS total,
COALESCE(SUM(sales), 0) AS total_sales,
IFNULL(AVG(score), 0) AS avg_score
FROM exam;
| 避坑點 | 錯誤示範 | 正確做法 |
|---|---|---|
| 隱式類型轉換導致索引失效 | WHERE IFNULL(varchar_col, 0) = 0 | WHERE varchar_col IS NULL OR varchar_col = '' |
| 默認值與列類型不匹配 | IFNULL(datetime_col, 0) | IFNULL(datetime_col, '1970-01-01') 或 COALESCE(datetime_col, '1970-01-01') |
| 大量 NULL 列預先轉換增加 CPU | SELECT 列表 20+ 個 IFNULL | 應用層處理或視圖預計算 |
-- 多參數,返回首個非 NULL,跨數據庫可移植
SELECT COALESCE(r.region_name, r.region_code, 'N/A') AS region
FROM userinfo ui
LEFT JOIN region r ON ui.adm_regionid = r.id;
IFNULL(代碼最短)。COALESCE(標準 SQL)。CASE WHEN。