一、核心作用
返回 参数列表中第一个非 NULL
的值 。当某个字段可能为 NULL
,但你需要一个默认值(比如 0
、'未知'
等)时,用它直接替换,避免因 NULL
导致计算或展示异常。
二、语法结构
COALESCE(值1, 值2, 值3, ...)
- 参数说明:
依次检查每个参数,返回 第一个非NULL
的值 。如果所有参数都是NULL
,则返回NULL
(不过实际使用时,通常最后会放一个默认值,确保不会返回NULL
)。
三、实战示例
1. 基础用法:替换 NULL
为默认值
假设有表 products
:
id | product_name | price | discount |
1 | 手机 | 5000 | 500 |
2 | 电脑 | 8000 | NULL |
计算实际支付价格(原价 - 折扣),若折扣为 NULL
则按无折扣算:
SELECT
product_name,
price,
discount,
price - COALESCE(discount, 0) AS final_price -- 折扣为NULL时按0算
FROM products;
结果:
product_name | price | discount | final_price |
手机 | 5000 | 500 | 4500 |
电脑 | 8000 | NULL | 8000 |
2. 多参数场景:从多个字段取有效值
假设有表 users
,用户可能填邮箱或手机号:
id | email | phone |
1 | test@a.com | NULL |
2 | NULL | 13800138 |
3 | NULL | NULL |
优先获取邮箱,邮箱为空则取手机号,都为空则显示 '未填写'
:
SELECT
id,
COALESCE(email, phone, '未填写') AS contact_info
FROM users;
结果:
id | contact_info |
1 | test@a.com |
2 | 13800138 |
3 | 未填写 |
3. 结合聚合函数:避免 NULL
影响统计结果
统计 orders
表的总金额(amount
字段可能为 NULL
):
SELECT
SUM(COALESCE(amount, 0)) AS total_amount -- 把NULL转为0,避免SUM结果为NULL
FROM orders;
四、对比 IFNULL
和 CASE WHEN
函数 | 适用场景 | 示例 |
| 从多个值中取第一个非 |
|
| 仅处理单字段 |
|
| 复杂条件判断(不仅限于 |
|
三者等价示例:
-- 需求:若 discount 为 NULL,返回 0
COALESCE(discount, 0) -- 最简写法
IFNULL(discount, 0) -- 专门处理NULL的简写
CASE WHEN discount IS NULL THEN 0 ELSE discount END -- 通用写法
五、常见场景
- 数据清洗:导入数据时,将
NULL
替换为合理默认值(如0
、'未知'
)。 - 报表计算:避免
NULL
导致求和、平均等统计结果异常。 - 展示优化:前端展示时,把
NULL
转为用户友好的文案(如'未填写'
、'待确认'
)
六、注意事项
- 参数类型需兼容:
所有参数最好是同类型(如都是数值或字符串),否则可能触发隐式类型转换(如字符串和数字混合),导致结果不符合预期。 - 性能差异:
COALESCE
和IFNULL
性能接近,远高于CASE WHEN
(尤其是大数据量时),优先用前两者。 - 嵌套使用:
可以嵌套多层,比如COALESCE(a, COALESCE(b, c))
,但建议保持简单,避免逻辑复杂难维护。