coalesce 返回首个非null值,用于兜底;nullif在两表达式相等时返回null,用于防错;二者组合应先nullif再coalesce,且均为ansi标准函数,兼容性优于方言函数。

COALESCE 和 NULLIF 是 SQL 中处理空值和异常场景的两个关键函数,它们不替代 CASE,但胜在简洁、标准、高效。用对了,能大幅简化逻辑;用错了,反而掩盖业务问题或引发隐性错误。
COALESCE:找第一个“靠谱”的值
它从左到右扫描参数,遇到第一个非 NULL 值就立刻返回,其余参数不再计算。这个“短路”特性不仅提升性能,还能避免副作用(比如调用带副作用的子查询)。
- 多字段兜底很常见:比如 COALESCE(mobile, phone, email, '暂无联系方式') —— 按优先级取联系信息
- 数值计算防空:奖金字段可能为 NULL,写成 salary + COALESCE(bonus, 0) 就不会让整行结果变 NULL
- 注意类型一致:如果前几个参数是字符串,最后一个给数字 0,某些数据库会隐式转成字符串 '0',显示或排序可能出人意料
NULLIF:主动制造 NULL 来“拦住”危险操作
它只做一件事:当两个表达式相等时,返回 NULL;否则返回第一个表达式的值。这不是兜底,而是“主动规避”。最典型用途就是防除零。
- 安全除法核心写法:revenue / NULLIF(employee_count, 0) —— employee_count 为 0 时,整条除法变成 X / NULL,结果自然为 NULL,不报错
- 清洗脏数据:比如把占位符 'N/A'、'Unknown' 或空字符串统一转为空值,NULLIF(status, 'N/A') 或 NULLIF(TRIM(name), '')
- 慎用浮点比较:NULLIF(price, 0.0) 在某些数据库里可能因精度问题失效,整数列建议用 NULLIF(price, 0)
组合使用:先避错,再兜底
NULLIF 负责把危险输入(如除零)转化为安全的 NULL;COALESCE 负责把最终结果里的 NULL 显式转成业务可接受的默认值。二者分工明确,顺序不能颠倒。
- 正确写法:COALESCE(revenue / NULLIF(employee_count, 0), 0) —— 先 NULLIF 防错,再 COALESCE 给默认值
- 错误写法:COALESCE(NULLIF(employee_count, 0), 1) —— 把除数强行改成 1,看似不报错,实则扭曲了业务语义
- WHERE 中要小心:写 WHERE revenue / NULLIF(employee_count, 0) > 100,当 employee_count = 0 时整表达式为 NULL,该行被过滤(三值逻辑),不是“等于 false”,而是“未知”,容易漏数据
跨数据库适配要点
COALESCE 和 NULLIF 都是 ANSI 标准函数,在 PostgreSQL、SQL Server、SQLite、MySQL(默认模式)中行为一致。但 Oracle 和老版本 MySQL 有些细节要注意:
- Oracle 不支持 NULLIF?不对——它支持,但部分旧文档有误;若真遇不支持环境,可用 CASE WHEN y = 0 THEN NULL ELSE y END 替代
- MySQL 开启严格模式(STRICT_TRANS_TABLES)后,10 / 0 会报错,所以仍推荐始终用 NULLIF 显式防御,不依赖默认行为
- 想写兼容性最强的代码?优先用 COALESCE 而非 IFNULL 或 NVL,前者是标准,后者分别是 MySQL 和 Oracle 的方言










