首页 / 条件、空值和类型转换
条件、空值和类型转换函数对照
条件、空值和类型转换函数在 MaxCompute、Hologres、StarRocks、Doris、Hive、Spark SQL、Flink SQL 中的写法对照,共 5 个函数。其中 2 个函数在部分引擎中需要改写或没有对应函数。
目录:coalesce · decode · greatest · if · nvl
COALESCE 取第一个非空值
COALESCE 从左到右返回第一个非 NULL 的参数,全部为 NULL 时返回 NULL。七个引擎都同名可用,差异主要在参数类型要求,以及 MaxCompute 在全部参数为 NULL 常量时会报错。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | COALESCE(expr1, expr2, ...) |
| Hologres | 支持 | COALESCE(expr1, expr2, ...) |
| StarRocks | 支持 | coalesce(expr1, ...) |
| Doris | 支持 | COALESCE(expr[, ...]) |
| Hive | 支持 | COALESCE(v1, v2, ...) |
| Spark SQL | 支持 | coalesce(expr1, expr2, ...) |
| Flink SQL | 支持 | COALESCE(value1 [, value2]*) |
DECODE 多值匹配
DECODE(expr, search1, result1, ..., default) 按值匹配返回结果,相当于简单的 CASE 表达式。MaxCompute 和 Spark 3.2 起支持这种写法;Hive 和 Flink 的 DECODE 是按字符集解码二进制,含义完全不同;其他引擎要改写为 CASE。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | DECODE(expression, search, result[, search, result]...[, default]) |
| Hologres | 需改写 | CASE expr WHEN search THEN result ... ELSE default END |
| StarRocks | 需改写 | CASE expr WHEN search THEN result ... ELSE default END |
| Doris | 需改写 | CASE expr WHEN search THEN result ... ELSE default END |
| Hive | 需改写 | CASE expr WHEN search THEN result ... ELSE default END |
| Spark SQL | 支持 | decode(expr, search, result [, search, result ] ... [, default]) |
| Flink SQL | 需改写 | CASE expr WHEN search THEN result ... ELSE default END |
GREATEST 多值取最大
GREATEST 返回参数中的最大值。差异主要在 NULL:StarRocks、Doris、Hive 2.0 起和 Flink 只要有一个参数为 NULL 就返回 NULL;MaxCompute 默认和 Spark 会跳过 NULL。同样的 SQL 迁移后可能从有值变成 NULL。LEAST 的规则相同。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | GREATEST(var1, var2[, ...]) |
| Hologres | 支持 | GREATEST(value1, value2, ...) |
| StarRocks | 支持 | GREATEST(expr1, ...) |
| Doris | 支持 | GREATEST(expr[, ...]) |
| Hive | 支持 | greatest(T v1, T v2, ...) |
| Spark SQL | 支持 | greatest(expr, ...) |
| Flink SQL | 支持 | GREATEST(value1[, value2]*) |
IF 条件判断
IF 在条件为真时返回第二个参数,否则返回第三个参数。七个引擎大多支持 IF,Hologres 需要 V2.1 及以上版本。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | IF(testCondition, valueTrue, valueFalseOrNull) |
| Hologres | 支持 | IF(condition, value_if_true, value_if_false) |
| StarRocks | 支持 | if(expr1, expr2, expr3) |
| Doris | 支持 | IF(condition, value_true, value_false_or_null) |
| Hive | 支持 | if(testCondition, valueTrue, valueFalseOrNull) |
| Spark SQL | 支持 | if(expr1, expr2, expr3) |
| Flink SQL | 支持 | IF(condition, true_value, false_value) |
NVL 空值替换
NVL 在第一个参数为 NULL 时返回第二个参数。MaxCompute、Doris、Hive 和 Spark 可以直接使用,Hologres、StarRocks 和 Flink SQL 需要改写为 COALESCE 或 IFNULL。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | NVL(value, default_value) |
| Hologres | 需改写 | COALESCE(value, default_value) |
| StarRocks | 需改写 | IFNULL(expr1, expr2) |
| Doris | 支持 | NVL(expr1, expr2) |
| Hive | 支持 | NVL(value, default_value) |
| Spark SQL | 支持 | nvl(expr1, expr2) |
| Flink SQL | 需改写 | IFNULL(input, null_replacement) |