SQL 方言通

首页 / 条件、空值和类型转换

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

迁移注意事项

示例

计算客单价,订单数为 0 时返回 NULL 而不是报错

MaxCompute
SELECT shop_id, gmv / NULLIF(order_cnt, 0) AS avg_price FROM shop_daily;
Hologres
SELECT shop_id, gmv / NULLIF(order_cnt, 0) AS avg_price FROM shop_daily;
StarRocks
SELECT shop_id, gmv / NULLIF(order_cnt, 0) AS avg_price FROM shop_daily;
Doris
SELECT shop_id, gmv / NULLIF(order_cnt, 0) AS avg_price FROM shop_daily;
Hive
SELECT shop_id, gmv / nullif(order_cnt, 0) AS avg_price FROM shop_daily;
Spark SQL
SELECT shop_id, gmv / nullif(order_cnt, 0) AS avg_price FROM shop_daily;
Flink SQL
SELECT shop_id, gmv / NULLIF(order_cnt, 0) AS avg_price FROM shop_daily;

同类函数

条件、空值和类型转换:全部引擎写法对照

核对日期: · 提交勘误