首页 / 条件、空值和类型转换
COALESCE 取第一个非空值
COALESCE 从左到右返回第一个非 NULL 的参数,全部为 NULL 时返回 NULL。七个引擎都同名可用,差异主要在参数类型要求,以及 MaxCompute 在全部参数为 NULL 常量时会报错。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | COALESCE(expr1, expr2, ...) | 遇到第一个非 NULL 值就返回,后续参数不再计算。返回类型与参数类型相同。不读表、且参数全部为 NULL 时报错;读表时返回 NULL。 | 官方文档 |
| Hologres | 支持 | COALESCE(expr1, expr2, ...) | 所有表达式为 NULL 时返回 NULL。 | 官方文档 |
| StarRocks | 支持 | coalesce(expr1, ...) | 参数类型必须兼容,返回类型与 expr1 相同。 | 官方文档 |
| Doris | 支持 | COALESCE(expr[, ...]) | 参数类型必须兼容。 | 官方文档 |
| Hive | 支持 | COALESCE(v1, v2, ...) | 参数类型为同一类型 T,返回类型也是 T。 | 官方文档 |
| Spark SQL | 支持 | coalesce(expr1, expr2, ...) | Spark 1.0.0 起提供。 | 官方文档 |
| Flink SQL | 支持 | COALESCE(value1 [, value2]*) | 返回类型是所有参数的公共类型。所有参数都可为空时,结果也可为空。 | 官方文档 |
迁移注意事项
- 各引擎对参数类型的要求不同。StarRocks 的返回类型跟随第一个参数,Flink 取所有参数的公共类型。COALESCE(amount, '0') 这类数值和字符串混用的写法,迁移后结果类型可能变化,建议参数类型保持一致。
- MaxCompute 中 SELECT COALESCE(NULL, NULL) 这种不读表、参数全部为 NULL 的写法会报错。临时测试时注意这一点,读表时不受影响。
- COALESCE 只把 NULL 当作空值,空字符串 '' 会被直接返回。要把空字符串也当作空值,先用 NULLIF(col, '') 处理。
示例
渠道为空时依次取备用字段,最后兜底为 unknown
SELECT COALESCE(channel, sub_channel, 'unknown') FROM orders;SELECT coalesce(channel, sub_channel, 'unknown') FROM orders;SELECT COALESCE(channel, sub_channel, 'unknown') FROM orders;