nullif:等值判断返回 NULL
速查结论
nullif(expr1, expr2) 是 Spark SQL 中用于在等值时返回 NULL的函数。如果 expr1 = expr2 则返回 NULL,否则返回 expr1。常用于避免除零错误——nullif(divisor, 0) 将 0 转为 NULL,配合 coalesce 提供默认值。
语法
nullif(expr1, expr2)
参数说明
| 参数 | 说明 |
|---|---|
expr1 | 待比较的第一个表达式 |
expr2 | 待比较的第二个表达式 |
返回值:expr1 = expr2 时返回 NULL,否则返回 expr1。
Since: 2.0.0
示例
基础用法
-- 相等返回 NULL
SELECT nullif(2, 2);
-- 结果: NULL
-- 不等返回 expr1
SELECT nullif(2, 3);
-- 结果: 2
实际业务场景
-- 避免除零:将 0 转为 NULL,再用 coalesce 兜底
SELECT amount / nullif(divisor, 0) AS rate
FROM sales;
-- divisor=0 时结果为 NULL 而非报错
-- 配合 coalesce 提供默认值
SELECT amount / coalesce(nullif(divisor, 0), 1) AS rate
FROM sales;
-- divisor=0 时用 1 代替
nullif vs CASE WHEN 对比
nullif 是 CASE WHEN 的语法糖,两者等价。
-- nullif 写法
SELECT nullif(col, 0) FROM t;
-- 等价 CASE WHEN 写法
SELECT CASE WHEN col = 0 THEN NULL ELSE col END FROM t;
常见报错与避坑指南
与 nvl / ifnull 的区别
nullif 的逻辑与 nvl / ifnull 完全不同,容易搞混:
| 函数 | 逻辑 | 返回值特征 |
|---|---|---|
nullif(A, B) | A = B → NULL,否则 → A | 可能返回 NULL |
nvl(A, B) | A IS NULL → B,否则 → A | 永远不会返回 B 以外的 NULL |
ifnull(A, B) | 同 nvl | 同 nvl |
类型必须可比
expr1 和 expr2 必须是可比较的类型(相同或可隐式转换),否则返回 NULL。
-- 类型不同:返回 NULL
SELECT nullif(1, '1');
-- 结果: NULL
📱关注公众号
「数据仓库技术」文章同步更新,不错过每一篇干货

💬加群交流
备注「数据仓库技术」加入社群,每日一道大厂SQL真题
