首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL COALESCE 函數實戰:返回第一個非 NULL 值,優雅處理預設值與空值轉換

     編輯:MySQL 綜合教學

函數簽名

COALESCE(val1, val2, val3, ...)

返回參數列表中 **第一個非 NULL** 的值;**全 NULL 返回 NULL**。

基礎示例

SELECT COALESCE(NULL, NULL, 1);              -- → 1
SELECT COALESCE(NULL, NULL, NULL, NULL, 1);  -- → 1
SELECT COALESCE(NULL, NULL, NULL);           -- → NULL

核心場景:字段預設值回填

業務表字段 `discount` 允許 NULL,查詢時需展示為 0:

-- 傳統寫法 (冗長)
SELECT IF(discount IS NULL, 0, discount) AS discount FROM orders;

-- COALESCE 寫法 (優雅、標準 SQL)
SELECT COALESCE(discount, 0) AS discount FROM orders;

進階用法

多級降級預設值

-- 優先級:用戶設定 > 部門設定 > 系統默認 > 0
SELECT COALESCE(user_conf, dept_conf, sys_conf, 0) AS final_conf
FROM settings;

字符串拼接防 NULL 導致全 NULL

-- 若任一字段 NULL,CONCAT 結果全 NULL
SELECT CONCAT(first_name, ' ', last_name) FROM users;  -- 風險

-- 安全寫法
SELECT CONCAT(COALESCE(first_name, ''), ' ', COALESCE(last_name, '')) FROM users;

配合聚合函數

-- 無數據時返回 0 而非 NULL
SELECT COALESCE(SUM(amount), 0) FROM orders WHERE user_id = 999;

對比:COALESCE vs IFNULL vs CASE

函數參數數標準適用場景
COALESCEN (≥2)ANSI SQL多級降級、通用性最強
IFNULL2MySQL 專有簡單雙值替換,微快
IF(expr, v1, v2)3MySQL 專有邏輯判斷非 NULL 情況
CASE WHEN靈活ANSI SQL複雜條件分支

效能提示

  • `COALESCE` 內部實現為 `CASE WHEN val1 IS NOT NULL THEN val1 WHEN val2 IS NOT NULL THEN val2 ...`,**參數按序求值**,遇非 NULL 立即返回 (短路)。
  • 參數列表**常量前置** 微優:`COALESCE(col, 0)` 優於 `COALESCE(0, col)` (後者恒返回 0)。
  • 大表高頻查詢可考慮 **生成列** 物化:`ALTER TABLE t ADD col_nn INT AS (COALESCE(col, 0)) STORED; INDEX idx(col_nn);`

避坑指南

  1. **不要混淆空字符串 `''` 與 NULL**:`COALESCE('', 'default')` 返回 `''` (非 NULL)。需 `NULLIF(col, '')` 轉換。
  2. **數據類型隱式轉換**:參數類型不一致時按優先級轉換,可能導致精度損失/報錯,建議顯式 `CAST`。
  3. **NOT NULL 列無需 COALESCE**:優化器會常量折疊,但多餘函數調用仍有微小開銷。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved