首页 / 条件、空值和类型转换
NULLIF 两值相等时返回 NULL
NULLIF(a, b) 在 a 等于 b 时返回 NULL,否则返回 a,等价于 CASE WHEN a = b THEN NULL ELSE a END。七个引擎都同名支持,常用来把 0 或空字符串转成 NULL,避免除以 0。Hive 2.3.0 起才有这个函数。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | NULLIF(expr1, expr2) | 参数可以是 MaxCompute 支持的任意类型。文档示例 nullif(3, null) 返回 3。 | 官方文档 |
| Hologres | 支持 | NULLIF(value1, value2) | 与 PostgreSQL 的条件函数一致,两个值相等时返回 NULL,否则返回第一个值。 | 官方文档 |
| StarRocks | 支持 | NULLIF(expr1, expr2) | 两个参数的类型要兼容,返回类型与 expr1 相同。 | 官方文档 |
| Doris | 支持 | NULLIF(expr1, expr2) | 支持布尔、数值、日期和字符串类型,等价于 CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END。 | 官方文档已实测 4.1.5 |
| Hive | 支持 | nullif(a, b) | Hive 2.3.0 起提供,是 CASE WHEN a = b THEN NULL ELSE a END 的简写。 | 官方文档已实测 4.2.1 |
| Spark SQL | 支持 | nullif(expr1, expr2) | Spark 2.0.0 起提供。 | 官方文档 |
| Flink SQL | 支持 | NULLIF(value1, value2) | 文档示例 NULLIF(5, 5) 返回 NULL,NULLIF(5, 0) 返回 5。 | 官方文档已实测 2.3.0 |
迁移注意事项
- Hive 2.3.0 之前没有 NULLIF,老集群要写成 CASE WHEN a = b THEN NULL ELSE a END。
- 第二个参数是 NULL 时不会返回 NULL。因为 a = NULL 的比较结果不是真,所以 MaxCompute 的 nullif(3, null) 返回 3。
- 两个参数类型不同时会先做隐式转换,各引擎的转换规则不一样。比较字符串和数字时,建议先 CAST 成同一类型。
- NULLIF 只能把一个值转成 NULL。要同时处理 0 和空字符串时,可以嵌套使用,或者改用 CASE WHEN。
示例
计算客单价,订单数为 0 时返回 NULL 而不是报错
SELECT shop_id, gmv / NULLIF(order_cnt, 0) AS avg_price FROM shop_daily;SELECT shop_id, gmv / NULLIF(order_cnt, 0) AS avg_price FROM shop_daily;SELECT shop_id, gmv / NULLIF(order_cnt, 0) AS avg_price FROM shop_daily;SELECT shop_id, gmv / NULLIF(order_cnt, 0) AS avg_price FROM shop_daily;SELECT shop_id, gmv / nullif(order_cnt, 0) AS avg_price FROM shop_daily;SELECT shop_id, gmv / nullif(order_cnt, 0) AS avg_price FROM shop_daily;SELECT shop_id, gmv / NULLIF(order_cnt, 0) AS avg_price FROM shop_daily;