什么是 COALESCE 函数?
核心作用:返回参数列表中第一个非 NULL 的值,支持所有主流数据库(MySQL、Oracle、SQL Server 等)。
为什么需要用它?
在数据库中,NULL 值不是空字符串也不是 0,却会导致:
- 查询结果显示异常(比如联系方式为空)
- 计算出错(比如金额 + NULL 会得到 NULL)
- 代码冗长(用多层 CASE WHEN 判断)
实战案例:3 种场景秒懂用法
场景 1:优化用户联系方式展示
需求:优先显示手机号,手机号为空时显示邮箱,两者都空则显示 “未填写”。
传统写法(繁琐):
SELECT
username,
CASE
WHEN phone IS NOT NULL THEN phone
WHEN email IS NOT NULL THEN email
ELSE '未填写'
END AS contact_info
FROM user_profile;
COALESCE 写法(简洁):
SELECT
username,
COALESCE(phone, email, '未填写') AS contact_info
FROM user_profile;
场景 2:处理异常日期计算
需求:计算用户注册天数,注册时间异常(为 NULL)时显示 0。
传统写法(多判断):
SELECT
username,
CASE
WHEN register_time IS NOT NULL THEN DATEDIFF(CURDATE(), register_time)
ELSE 0
END AS register_days
FROM user_profile;
COALESCE 写法(一步到位):
SELECT
username,
COALESCE(DATEDIFF(CURDATE(), register_time), 0) AS register_days
FROM user_profile;
场景 3:避免计算结果为 NULL
需求:计算订单总金额(含优惠,优惠可能为 NULL)。
直接计算(会出问题):
-- 当discount为NULL时,结果会变成NULL
SELECT order_id, amount + discount AS total_amount FROM orders;
COALESCE 处理(安全计算):
-- 优惠为NULL时自动按0计算
SELECT
order_id,
amount + COALESCE(discount, 0) AS total_amount
FROM orders;
4 大核心优势
- 简化代码:一行替代多层 CASE WHEN,减少 50%+ 代码量
- 防错兜底:自动处理 NULL 值,避免计算 / 展示异常
- 通用兼容:所有数据库都支持,不用改语法
- 一眼看懂:函数名和逻辑对应,新手也能快速理解
你遇到过因 NULL 值导致的奇葩问题吗?比如报表突然出现空白、计算结果莫名错误?除了 COALESCE,你还有哪些压箱底的处理技巧?评论区分享一下!