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

SQL Server COALESCE 函數實戰:優雅替代巢狀 CASE WHEN 的多列非空取值神器

     編輯:關於SqlServer

函數簽名與語義

COALESCE(expression1, expression2, ..., expressionN)
-- 返回參數列表中第一個非 NULL 的表達式值
-- 等價於:
CASE
  WHEN expression1 IS NOT NULL THEN expression1
  WHEN expression2 IS NOT NULL THEN expression2
  ...
  ELSE NULL
END

典型應用場景

1. 多候選列取首非空值

-- 取聯繫電話:手機 > 辦公 > 住宅 > '無'
SELECT COALESCE(mobile, office_phone, home_phone, '無') AS contact_phone
FROM customers;

2. 動態排序/分組兜底


ORDER BY COALESCE(priority, 999), created_at;
GROUP BY COALESCE(region, 'Unknown');

3. 計算邏輯中避免 NULL 傳播


SELECT price * COALESCE(discount, 1) AS final_price; -- 無折扣按原價

與 ISNULL 的關鍵區別

特性COALESCEISNULL
參數數量不限(≥2)固定 2 個
標準ANSI SQL 標準T-SQL 專有
返回類型按優先級推導所有參數跟隨第一個參數
可空性結果可為 NULL(若全 NULL)結果不可為 NULL(若第二參數非 NULL)
性能微慢(轉為 CASE)極快(內部函數)

進階技巧:動態 PIVOT 列標題


SELECT
  COALESCE([2023], [2022], [2021], 0) AS latest_year_sales
FROM pivot_table;

注意事項

  • 參數類型必須隱式可轉換,否則報錯(如 INT + DATETIME)。
  • 超過 10 個參數時,考慮可讀性與編譯開銷,必要時拆分邏輯。
  • COALESCE(col, 0) 於索引列可能導致隱式轉換阻礙索引尋找 → 優先用 ISNULL 或 CASE。

結語

COALESCE 是處理「多備選、取首非空」的標準利器。掌握其與 ISNULL 的類型推導差異,能寫出更健壯、可移植、可維護的 T-SQL 代碼。

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