首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL SELECT 查詢中設定預設顯示值:IFNULL/COALESCE 實戰

     編輯:MySQL 資料庫相關知識

場景

LEFT JOIN 時,右表無匹配行會產生 NULL。前端顯示或後續運算常需將 NULL 轉為預設值(如 0、空字串、'N/A')。

核心函數對比

函數語法回傳支援版本
IFNULLIFNULL(expr, default)expr 非 NULL 時回傳 expr,否則 default所有版本
COALESCECOALESCE(expr1, expr2, ...)回傳第一個非 NULL 參數所有版本(標準 SQL)
IFIF(condition, true_val, false_val)條件判斷所有版本
CASECASE 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`;

進階用法

1. 聚合函數搭配

SELECT
    `category`,
    COALESCE(SUM(`amount`), 0) AS `total_amount`,
    COALESCE(COUNT(`id`), 0) AS `order_count`
FROM `orders`
GROUP BY `category`;

2. 更新語句中使用

UPDATE `products`
SET `stock` = IFNULL(`stock`, 0) + 10
WHERE `id` = 123;

3. 條件判斷替代

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。
  • 大量資料匯出/報表時,直接在 SQL 層處理預設值,減少應用層迴圈判斷。

結語

善用 IFNULL(雙參數簡潔)與 COALESCE(多參數彈性、標準 SQL),能在查詢層優雅解決 NULL 顯示問題,提升程式碼可讀性與前端相容性。記住:查詢層處理預設值,條件層避免函數包裹。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved