跳到主要内容

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真题

交流微信二维码

你可能还想看