COALESCE 是 SQL 中处理 NULL 值的核心函数之一,用于返回参数列表中第一个非 NULL 的值。其语法为:
COALESCE(value1, value2, value3, ..., valuen)
最常见用途:用默认值替换 NULL 显示。
-- 当电话号码为NULL时显示 '未提供'
SELECT
name,
COALESCE(phone, '未提供') AS phone_display
FROM users;
-- 多级默认值:优先显示昵称,没有则用用户名,都没有则用'匿名'
SELECT COALESCE(nickname, username, '匿名') AS display_name
FROM users;
NULL 参与计算会导致结果为 NULL。
-- 计算总价(单价*数量),处理可能的NULL值
SELECT
product_name,
unit_price,
quantity,
COALESCE(unit_price, 0) * COALESCE(quantity, 0) AS total_price
FROM sales;
-- 奖金计算:基础奖金+绩效奖金,处理NULL
SELECT COALESCE(base_bonus, 0) + COALESCE(performance_bonus, 0) AS total_bonus
FROM employees;
从多个可能为 NULL 的列中选择第一个有效值。
-- 联系方式优先级:手机 > 邮箱 > 固定电话
SELECT
name,
COALESCE(mobile, email, tel, '无联系方式') AS contact_info
FROM contacts;
-- 地址合并:优先送货地址,没有则用账单地址
SELECT COALESCE(shipping_address, billing_address) AS delivery_address
FROM orders;
替代复杂的 CASE WHEN 语句,使代码更简洁。
-- 用CASE WHEN实现
SELECT
CASE
WHEN column1 IS NOT NULL THEN column1
WHEN column2 IS NOT NULL THEN column2
ELSE 'default'
END AS result
-- 用COALESCE简化
SELECT COALESCE(column1, column2, 'default') AS result
外连接时处理未匹配到的行。
-- 左连接时,B表没有匹配记录显示0
SELECT
a.department_id,
COALESCE(SUM(b.sales), 0) AS total_sales
FROM departments a
LEFT JOIN sales_records b ON a.id = b.department_id
GROUP BY a.department_id;
统一数据格式,处理缺失值。
-- 将不同格式的日期统一处理
SELECT
COALESCE(
TRY_CAST(date_str AS DATE), -- 尝试转换字符串
default_date, -- 转换失败用默认
GETDATE() -- 都没有用当前日期
) AS clean_date
FROM raw_data;
-- 订单显示:优先显示买家备注,没有则用系统备注
SELECT
order_id,
COALESCE(customer_notes, system_notes, '无备注') AS display_notes,
COALESCE(coupon_discount, 0) AS actual_discount
FROM orders;
-- 生成员工通讯录
SELECT
COALESCE(preferred_name, first_name || ' ' || last_name) AS display_name,
COALESCE(direct_phone, department_phone, '内线:1000') AS contact,
COALESCE(salary, 0) AS base_salary
FROM employees;
-- 计算可用库存
SELECT
product_id,
COALESCE(warehouse_stock, 0)
+ COALESCE(in_transit, 0)
- COALESCE(reserved, 0) AS available_stock
FROM inventory;
性能考虑:COALESCE 会在找到第一个非 NULL 值后停止评估后续参数,这在某些复杂计算中可优化性能。
类型一致性:所有参数应具有相同或兼容的数据类型,否则可能隐式转换。
与 ISNULL 区别:
ISNULL (SQL Server):只接受两个参数COALESCE:ANSI 标准,支持多个参数,更通用与 NVL 区别:
NVL (Oracle):功能类似 COALESCE,但只有两个参数COALESCE:Oracle 中也推荐使用,更标准空列表处理:COALESCE() 不带参数会报错。
✅ 明确默认值的意义:确保默认值在业务逻辑上合理
✅ 注意性能影响:对大数据集,优先考虑使用 WHERE 过滤 NULL
✅ 保持类型一致:避免隐式转换带来的性能问题
✅ 与 NULLIF 配合使用:COALESCE(NULLIF(column, ''), 'N/A') 可处理空字符串
✅ 记录默认值的使用:在数据字典中记录使用了哪些默认值
COALESCE 的核心价值在于简化 NULL 处理逻辑,使 SQL 代码更简洁、可读性更强,同时保持 ANSI 标准兼容性。在实际开发中,合理使用可以显著提高代码质量和维护性。