首页 / 条件、空值和类型转换
NVL 空值替换
NVL 在第一个参数为 NULL 时返回第二个参数。MaxCompute、Doris、Hive 和 Spark 可以直接使用,Hologres、StarRocks 和 Flink SQL 需要改写为 COALESCE 或 IFNULL。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | NVL(value, default_value) |
文档要求两个参数的数据类型一致。 | 官方文档 |
| Hologres | 需改写 | COALESCE(value, default_value) |
条件函数文档中没有 NVL,只有 COALESCE、IF、NULLIF 等,需要改写为 COALESCE。 | 官方文档 |
| StarRocks | 需改写 | IFNULL(expr1, expr2) |
条件函数列表中没有 NVL,只有 case、coalesce、if、ifnull 和 nullif。IFNULL 的结果类型与 expr1 一致。 | 官方文档 |
| Doris | 支持 | NVL(expr1, expr2) |
NVL 是 IFNULL 的别名。expr1 不为 NULL 时返回 expr1,否则返回 expr2。 | 官方文档 |
| Hive | 支持 | NVL(value, default_value) |
Hive 0.11 起提供。 | 官方文档 |
| Spark SQL | 支持 | nvl(expr1, expr2) |
Spark 2.0.0 起提供,同时有 ifnull、nvl2 和 coalesce。 | 官方文档 |
| Flink SQL | 需改写 | IFNULL(input, null_replacement) |
没有 NVL,可以用 IFNULL 或 COALESCE。 | 官方文档 |
迁移注意事项
- MaxCompute 文档要求两个参数类型一致,例如 NVL(bigint_col, 0.0) 应先做 CAST。文档自带的示例里又有 datetime 列配字符串默认值的写法,两处说法不一致,建议实测。
- 迁移到 Hologres、StarRocks 或 Flink SQL 时,统一改写为 COALESCE 最省事,因为 COALESCE 在七个引擎中都可用。
- Flink 的 IFNULL 在第一个参数来自 JSON_VALUE 时可能返回错误结果,问题编号 FLINK-35832。受影响版本包括 1.15~1.20 和 2.0.0,问题已在 2024 年 7 月标记为修复,但没有写明修复版本,使用前请确认所用版本是否包含修复。
示例
折扣为空时按 0 计算
SELECT NVL(discount, 0) AS discount FROM orders;SELECT COALESCE(discount, 0) AS discount FROM orders;SELECT IFNULL(discount, 0) AS discount FROM orders;SELECT IFNULL(discount, 0) AS discount FROM orders;