Skip to content

COALESCE


在日常 SQL 开发中,经常会遇到 空值(NULL) 的问题:比如某列可能没有数据,我们希望用一个默认值替代它。

MySQL 提供了很多处理空值的函数,比如 IFNULL()ISNULL(),但是如果你有 多个候选值,哪个最先有值就用哪个呢?这时候就轮到 COALESCE 上场了!

COALESCE(expr1, expr2, ..., exprN) 会依次检查传入的表达式,返回 第一个非 NULL 的值

  • 如果所有表达式都是 NULL,则返回 NULL。

  • 可以处理多个参数,比 IFNULL() 灵活得多。

通俗理解: 想象你有几个水杯,第一个空的就跳过,找到第一个有水的就喝掉。COALESCE 就像你在挑水杯,只要有水就喝,不浪费时间。

SELECT COALESCE(NULL, NULL, '默认值', '其他值');
-- 结果: '默认值'
SELECT COALESCE(NULL, 123, 456);
-- 结果: 123

在第一个例子中,前两个参数都是 NULL,第三个 '默认值' 是第一个非 NULL 值,所以返回它。
在第二个例子中,第一个 NULL 被跳过,返回了 123。

  1. 多列取有效值

假设有一个用户表,有三个联系方式字段:mobilephoneemail,我们希望优先显示第一个非空联系方式:

SELECT name, COALESCE(mobile, phone, email, '暂无联系方式') AS contact
FROM user;
  • 用户有手机号就显示手机号

  • 没有手机号但有座机就显示座机

  • 都没有就显示 '暂无联系方式'

  1. 避免除零错误
SELECT 10 / COALESCE(NULLIF(divisor,0), 1) AS result
FROM my_table;
  • 先用 NULLIF 把 0 转成 NULL

  • 再用 COALESCE 给一个兜底值 1

  • 这样就避免了除零报错