优先用coalesce,因其是sql标准函数,支持多参数、跨数据库兼容;ifnull仅mysql特有、限两参数、类型处理宽松易致隐式转换错误,且不兼容其他数据库。

直接说结论:优先用 COALESCE,它标准、跨数据库兼容;IFNULL 只在 MySQL 里能用,别在其他环境硬套。
为什么 COALESCE 是更稳妥的选择
COALESCE 是 SQL 标准函数,PostgreSQL、SQL Server、Oracle、SQLite、MySQL 都支持。它按顺序检查参数,返回第一个非 NULL 的值,遇到 NULL 就跳过,不报错。
常见误用是把它当“二元替换”来写,比如 COALESCE(col, 'N/A') 看似简单,但要注意:如果 col 是数值型字段,而默认值用了字符串(如 '0'),某些数据库(如 PostgreSQL)会报类型不匹配错误。
- 确保所有参数类型一致,或至少可隐式转换(例如都转成
TEXT或都为NUMERIC) - 参数个数不限,可以链式兜底:
COALESCE(col, col_backup, 'unknown') - 性能上无明显开销,优化器通常能识别并短路求值
IFNULL 只适用于 MySQL,且行为有陷阱
IFNULL(expr1, expr2) 是 MySQL 特有函数,语义等价于 COALESCE(expr1, expr2),但只接受两个参数,且类型处理更“宽松”——它会尝试把 expr2 转换成 expr1 的类型。
这看似方便,实则埋雷:
- 若
expr1是INT,expr2是'missing',MySQL 会转成0(不是报错,而是静默转换) - 迁移到 MariaDB 或其他数据库时,
IFNULL直接报错:Unknown function: 'IFNULL' - 在视图或存储过程中混用,容易造成跨环境部署失败
替代方案:用 CASE WHEN 处理复杂逻辑
当默认值需要动态计算,或替换条件不止“是否为 NULL”,COALESCE 就不够用了。比如:字段为 NULL 时填当前时间,为 0 时填 'invalid',否则原值保留。
这时必须用 CASE WHEN:
SELECT
CASE
WHEN col IS NULL THEN NOW()
WHEN col = 0 THEN 'invalid'
ELSE col
END AS safe_col
FROM table_name;
注意:IS NULL 不能写成 = NULL,这是初学者高频错误;CASE 表达式结果类型由各分支共同决定,建议显式 CAST 统一类型,避免隐式转换出问题。
实际写 SQL 时最容易忽略的一点
很多人在 WHERE 子句里对可能为 NULL 的字段做比较,却忘了 NULL = NULL 永远是 UNKNOWN,导致查询结果漏数据。这时候 COALESCE 不是拿来“修复数据”的,而是该用 IS NULL 或 IS NOT NULL 显式判断。
换句话说:COALESCE 解决的是“显示/计算时的空值兜底”,不是“查询逻辑里的空值判定”。混淆这两者,再怎么套函数也查不到想要的行。











