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 的方言
