在 MySQL 中,COALESCE()是一个非常好用的流程控制函数。它的核心作用是按顺序检查参数列表,返回第一个非 NULL 的值。
函数语法
sql
COALESCE(value1, value2, ..., valueN)
参数:可以传入多个参数(至少 2 个)。
返回值:返回参数列表中第一个不为 NULL的值。
如果所有参数都为 NULL:则返回 NULL。
通俗理解
可以把COALESCE()想象成一个保安,他按顺序检查你给的一排人:
先问第一个人:你有值吗?
如果有,就把他带回来(返回这个值)
如果没有(是 NULL),就丢掉,继续问下一个
如果所有人都没有值(全是 NULL),就空手回来(返回 NULL)
简单示例
sql
-- 第一个值是 NULL,取第二个 SELECT COALESCE(NULL, 'hello', 'world'); -- 结果:'hello' -- 前两个都是 NULL,取第三个 SELECT COALESCE(NULL, NULL, 'world', 'test'); -- 结果:'world' -- 全为 NULL SELECT COALESCE(NULL, NULL, NULL); -- 结果:NULL
实际业务场景
1. 为 NULL 字段提供默认值
查询时,如果某个字段是 NULL,用默认值替代:
sql
-- 如果 nickname 是 NULL,显示为 '匿名用户' SELECT id, COALESCE(nickname, '匿名用户') AS display_name, email FROM users;
2. 在计算中处理 NULL
计算时,NULL 参与任何运算结果都是 NULL,用COALESCE可以规避:
sql
-- 如果 commission 是 NULL,按 0 计算 SELECT name, salary + COALESCE(commission, 0) AS total_income FROM employees;
3. 多字段优先级取值
从多个字段中取第一个有值的,常见于电话号码、地址等场景:
sql
-- 优先取手机号,没有则取固定电话,再没有取紧急联系人电话 SELECT name, COALESCE(mobile_phone, home_phone, emergency_phone, '无联系方式') AS contact FROM customers;
4. 结合其他函数使用
sql
-- 结合 NULLIF:如果为空字符串,也转为默认值 SELECT COALESCE(NULLIF(remark, ''), '无备注') AS remark FROM orders;
这里NULLIF(remark, '')的作用是:如果remark是空字符串'',就转为NULL,然后COALESCE再把它替换为'无备注'。
5. 在更新语句中使用
sql
-- 更新时,如果新值为空,则保留原值 UPDATE products SET price = COALESCE(new_price, price), -- 新价格为空则不变 discount = COALESCE(new_discount, discount) -- 新折扣为空则不变 WHERE id = 100;
与其他函数的区别
| 函数 | 作用 | 参数数量 | 区别 |
|---|---|---|---|
COALESCE() | 返回第一个非 NULL | 多个 | 通用、灵活 |
IFNULL(expr1, expr2) | 如果 expr1 是 NULL,返回 expr2,否则返回 expr1 | 2 个 | MySQL 特有,只能处理 2 个值 |
NULLIF(expr1, expr2) | 如果 expr1 = expr2,返回 NULL,否则返回 expr1 | 2 个 | 用于条件性地制造 NULL |
IF(condition, true_val, false_val) | 条件判断返回不同值 | 3 个 | 类似三目运算符 |
sql
-- IFNULL 只能处理两个参数 SELECT IFNULL(nickname, '匿名用户') FROM users; -- COALESCE 可以处理多个 SELECT COALESCE(wechat, mobile, email, '无联系方式') FROM users;
性能说明
COALESCE()是短路函数:它会从第一个参数开始依次判断,一旦找到非 NULL 的值,就不会再计算后面的参数。
sql
-- 如果 name 不为 NULL,后面的子查询不会执行 SELECT COALESCE(name, (SELECT COUNT(*) FROM huge_table)) FROM users;
总结
| 要点 | 说明 |
|---|---|
| 功能 | 返回第一个非 NULL 的值 |
| 语法 | COALESCE(value1, value2, ...) |
| 场景 | 空值替换、默认值、多字段优先级取值、计算防 NULL |
| 优点 | 简洁、可读性强、支持多参数、短路求值 |
| 注意 | 所有参数都为 NULL 时,返回 NULL |
COALESCE()是 SQL 标准函数(不仅 MySQL,Oracle、PostgreSQL、SQL Server 等都支持),非常通用,掌握它几乎是日常开发必备技能。