首页 / 条件、空值和类型转换
IF 条件判断
IF 在条件为真时返回第二个参数,否则返回第三个参数。七个引擎大多支持 IF,Hologres 需要 V2.1 及以上版本。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | IF(testCondition, valueTrue, valueFalseOrNull) |
条件为 NULL 时按 FALSE 处理,返回第三个参数。第二、三个参数的类型必须一致。 | 官方文档 |
| Hologres | 支持 | IF(condition, value_if_true, value_if_false) |
V2.1 起支持,条件为 FALSE 或 NULL 时返回第三个参数。V2.0 及以下版本需要升级实例,或改写为 CASE WHEN。 | 官方文档 |
| StarRocks | 支持 | if(expr1, expr2, expr3) |
expr1 必须是 BOOLEAN,expr2 和 expr3 类型要兼容,返回类型与 expr2 相同。 | 官方文档 |
| Doris | 支持 | IF(condition, value_true, value_false_or_null) |
官方文档 | |
| Hive | 支持 | if(testCondition, valueTrue, valueFalseOrNull) |
官方文档 | |
| Spark SQL | 支持 | if(expr1, expr2, expr3) |
Spark 1.0.0 起提供。 | 官方文档 |
| Flink SQL | 支持 | IF(condition, true_value, false_value) |
官方文档 |
迁移注意事项
- 条件为 NULL 时,MaxCompute 走 FALSE 分支。迁移后如果结果不一致,先检查条件列是否有 NULL。
- Doris 4.0.4 之前,IF、IFNULL、COALESCE 等条件函数不做短路求值,没有被选中的分支也会计算,这个分支报错时整条语句会失败。
- Hologres 实例版本低于 V2.1 时没有 IF,需要改写为 CASE WHEN。
- 需要在所有引擎通用的写法时,用 CASE WHEN condition THEN a ELSE b END。
示例
按金额标记大单
SELECT IF(amount >= 1000, 'big', 'small') AS size_tag FROM orders;-- V2.0 及以下版本
SELECT CASE WHEN amount >= 1000 THEN 'big' ELSE 'small' END AS size_tag FROM orders;