coalesce返回首个非null值,nullif在两表达式相等时返回null;二者常配合用于空值清洗、默认值替换及避免除零错误,如coalesce(nullif(trim(name), ''), '未知用户')和coalesce(sales_amount / nullif(target_amount, 0), 0)。

COALESCE 返回参数列表中第一个非 NULL 值,NULLIF 则在两个表达式相等时返回 NULL,否则返回第一个表达式。两者常配合使用,解决数据清洗、默认值替换、避免除零错误等实际问题。
用 COALESCE 统一空值处理逻辑
当字段可能为 NULL、空字符串或空白字符时,仅靠 IS NULL 不够。可先用 NULLIF 把无意义的空字符串转为 NULL,再用 COALESCE 统一兜底:
-
COALESCE(NULLIF(TRIM(name), ''), '未知用户')—— 去除首尾空格后若为空串,就变 NULL,最终取默认值 -
COALESCE(phone, NULLIF(mobile, ''), '暂未提供')—— 优先用 phone,为空则看 mobile(排除空串),都无效才用默认值 - 注意:COALESCE 内所有参数类型需兼容,否则可能报错;必要时显式转换,如
COALESCE(CAST(age AS VARCHAR), '保密')
用 NULLIF 避免除零和无效计算
在做除法或比例计算前,用 NULLIF 把分母“安全归零”为 NULL,再结合 COALESCE 提供默认结果,避免运行时报错:
-
COALESCE(sales_amount / NULLIF(target_amount, 0), 0)—— 分母为 0 时返回 NULL,再转成 0(表示未达标) -
ROUND(100.0 * completed / NULLIF(total, 0), 2)—— 百分比计算,total 为 0 时不报错,结果为 NULL,可再用 COALESCE 包一层 - 不要写成
NULLIF(0, 0)或NULLIF(col, col),这恒为 NULL,容易误用
嵌套组合提升条件判断能力
单个 NULLIF 或 COALESCE 功能有限,嵌套使用能模拟更复杂的“多路分支”逻辑:
-
COALESCE(NULLIF(status, 'N/A'), NULLIF(status, ''), '待确认')—— 先排除 'N/A',再排除空值,最后兜底 -
NULLIF(COALESCE(preferred_email, backup_email), '')—— 先选邮箱,再把结果中的空串转为 NULL(适合后续 IS NULL 判断) - 深度嵌套时建议拆成子查询或 CTE,提升可读性与维护性
注意事项与常见陷阱
这两个函数看似简单,但细节影响结果准确性:
- COALESCE 是按顺序逐个求值,遇到第一个非 NULL 就停止,因此把高频非空字段放前面可提升性能
- NULLIF 的两个参数必须类型兼容,比如
NULLIF('123', 123)在某些数据库会报错(字符串 vs 整数) - NULLIF(x, y) 等价于
CASE WHEN x = y THEN NULL ELSE x END,但更简洁;注意 NULL 与任何值比较都为 UNKNOWN,所以NULLIF(col, NULL)永远返回 col










