coalesce是sql标准函数,返回第一个非null参数值,兼容多数据库;而isnull(sql server)和ifnull(mysql)均为厂商私有函数,仅支持两个参数且跨库不兼容。

COALESCE 是什么,它和 ISNULL/IFNULL 有什么区别
COALESCE 是 SQL 标准函数,接受任意数量的参数,返回第一个非 NULL 的值。它不是某个数据库的私有函数,所以跨库兼容性比 ISNULL(SQL Server)或 IFNULL(MySQL)更好。
-
COALESCE要求所有参数类型兼容,数据库会尝试隐式转换,但失败时直接报错(比如COALESCE('a', 123)在 PostgreSQL 中会报类型冲突) -
ISNULL只支持两个参数,且在 SQL Server 中返回第一个参数的类型;IFNULL同理但限于 MySQL - 如果你写的 SQL 需要跑在 PostgreSQL、SQLite、Oracle 和 SQL Server 上,优先用
COALESCE
多列回退场景下怎么写 COALESCE
常见需求:查用户联系方式,优先用 mobile,没有就用 work_phone,再没有就用 email,最后兜底为 'N/A'。
SELECT name, COALESCE(mobile, work_phone, email, 'N/A') AS contact FROM users;
- 参数顺序就是回退优先级,从左到右逐个判断是否为
NULL - 所有列必须属于同一查询上下文(比如不能混用子查询字段而不加别名或显式引用)
- 最后一个参数建议明确写出默认值(如
'N/A'或0),避免漏写导致整行结果为NULL
容易踩的坑:空字符串、空格、'NULL' 字符串不是 NULL
COALESCE 只识别真正的 NULL,对空字符串 ''、全是空格的字符串、甚至字符串 'NULL' 都无感。
- 常见错误:以为
COALESCE(phone, '未填写')能覆盖phone = ''的情况 —— 实际不会触发回退 - 正确做法是先用
CASE或NULLIF清洗:COALESCE(NULLIF(TRIM(phone), ''), NULLIF(TRIM(work_phone), ''), 'N/A')
-
NULLIF(expr1, expr2)在两者相等时返回NULL,所以NULLIF(TRIM(col), '')能把空串转成NULL,再进COALESCE流程
性能与索引影响:COALESCE 会让 WHERE 条件失效
如果在 WHERE 中对列用 COALESCE,比如:
WHERE COALESCE(status, 'draft') = 'active'
- 这个表达式无法走
status列的索引(除非数据库支持函数索引且你提前建了) - 更高效写法是展开逻辑:
WHERE (status = 'active') OR (status IS NULL AND 'draft' = 'active')
- 但注意:这种展开只适合默认值固定且分支少的情况;复杂回退链建议在应用层处理,或用生成列 + 索引(如 MySQL 5.7+ 的
GENERATED COLUMN)
回退逻辑越深,COALESCE 越容易掩盖数据质量问题——比如连续三列都是 NULL,说明上游录入或同步可能出问题,而不是简单补个默认值就完事。










