条件函数和表达式
Elastic Stack Serverless
通过以 if-else 方式计算来返回其参数之一的函数。
CASE WHEN condition THEN result
[WHEN ...]
[ELSE default_result]
END
输入:
使用一个或多个 *WHEN condition THEN result 子句,并且表达式可以选择具有 *ELSE default_result 子句。每个 condition 应该是一个布尔表达式。
输出:如果相应的 *WHEN condition 计算结果为 true
,则为其中一个 result 表达式;如果所有 *WHEN condition 子句的计算结果都为 false
,则为 default_result。如果缺少可选的 *ELSE default_result 子句并且所有 *WHEN condition 子句的计算结果都为 false
,则返回 null
。
描述:CASE 表达式是一个通用的条件表达式,它模拟其他编程语言的 if/else 语句。如果条件的计算结果为 true,则紧跟在该条件后的结果表达式的值将作为返回值,后续的 when 子句将被跳过而不被处理。
SELECT CASE WHEN 1 > 2 THEN 'elastic'
WHEN 2 <= 3 THEN 'search'
END AS "case";
case
---------------
search
SELECT CASE WHEN 1 > 2 THEN 'elastic'
WHEN 2 > 10 THEN 'search'
END AS "case";
case
---------------
null
SELECT CASE WHEN 1 > 2 THEN 'elastic'
WHEN 2 > 10 THEN 'search'
ELSE 'default'
END AS "case";
case
---------------
default
作为一种变体,case 表达式可以用类似于其他编程语言的 switch-case 的语法来表示
CASE expression
WHEN value1 THEN result1
[WHEN value2 THEN result2]
[WHEN ...]
[ELSE default_result]
END
在这种情况下,它在内部转换为
CASE WHEN expression = value1 THEN result1
[WHEN expression = value2 THEN result2]
[WHEN ...]
[ELSE default_result]
END
SELECT CASE 5
WHEN 1 THEN 'elastic'
WHEN 2 THEN 'search'
WHEN 5 THEN 'elasticsearch'
END AS "case";
case
---------------
elasticsearch
SELECT CASE 5
WHEN 1 THEN 'elastic'
WHEN 2 THEN 'search'
WHEN 3 THEN 'elasticsearch'
ELSE 'default'
END AS "case";
case
---------------
default
所有结果表达式必须是兼容的数据类型。更具体地说,所有结果表达式都应该具有与第一个*非空*结果表达式兼容的数据类型。例如
对于以下查询
CASE WHEN a = 1 THEN null
WHEN a > 2 THEN 10
WHEN a > 5 THEN 'foo'
END
将返回一条错误消息,指出 foo 的数据类型为 keyword,与预期的数据类型 integer(基于结果 10)不匹配。
CASE 可以用作查询中的 GROUP BY 键,以方便自定义分桶并为这些桶分配描述性名称。例如,如果键的值太多,或者,简单地说,这些值的范围比每个单独的值更有趣,CASE 可以创建自定义桶,如以下示例所示
SELECT count(*) AS count,
CASE WHEN NVL(languages, 0) = 0 THEN 'zero'
WHEN languages = 1 THEN 'one'
WHEN languages = 2 THEN 'bilingual'
WHEN languages = 3 THEN 'trilingual'
ELSE 'multilingual'
END as lang_skills
FROM employees
GROUP BY lang_skills
ORDER BY lang_skills;
通过此查询,可以为值0、1、2、3创建具有描述性名称的常规分组桶,并且每个值>= 4都将落入多语言桶中。
COALESCE(
expression,
expression,
...)
输入:
- 第一个表达式
- 第二个表达式
…
第N个表达式
COALESCE 可以接受任意数量的参数。
输出:其中一个表达式或 null
描述:返回其参数中第一个非 null 的参数。如果所有参数均为 null,则返回 null
。
SELECT COALESCE(null, 'elastic', 'search') AS "coalesce";
coalesce
---------------
elastic
SELECT COALESCE(null, null, null, null) AS "coalesce";
coalesce
---------------
null
GREATEST(
expression,
expression,
...)
输入:
- 第一个表达式
- 第二个表达式
…
第N个表达式
GREATEST 可以接受任意数量的参数,并且所有参数必须是相同的数据类型。
输出:其中一个表达式或 null
描述:返回具有最大值且非 null 的参数。如果所有参数均为 null,则返回 null
。
SELECT GREATEST(null, 1, 2) AS "greatest";
greatest
---------------
2
SELECT GREATEST(null, null, null, null) AS "greatest";
greatest
---------------
null
IFNULL(
expression,
expression)
输入:
- 第一个表达式
- 第二个表达式
输出:如果第一个表达式为 null,则为第二个表达式,否则为第一个表达式。
描述:COALESCE
的变体,只有两个参数。返回其参数中第一个非 null 的参数。如果所有参数均为 null,则返回 null
。
SELECT IFNULL('elastic', null) AS "ifnull";
ifnull
---------------
elastic
SELECT IFNULL(null, 'search') AS "ifnull";
ifnull
---------------
search
IIF(
expression,
expression,
[expression])
输入:
- 要检查的布尔条件
- 如果布尔条件计算结果为
true
,则返回值 - 如果布尔条件计算结果为
false
,则返回值;可选
输出:如果第一个表达式(条件)的计算结果为 true
,则为第二个表达式。如果计算结果为 false
,则返回第三个表达式。如果未提供第三个表达式,则返回 null
。
描述:条件函数,用于实现编程语言的标准 *IF <condition> THEN <result1> ELSE <result2>* 逻辑。如果未提供第三个表达式并且条件的计算结果为 false
,则返回 null
。
SELECT IIF(1 < 2, 'TRUE', 'FALSE') AS result1, IIF(1 > 2, 'TRUE', 'FALSE') AS result2;
result1 | result2
---------------+---------------
TRUE |FALSE
SELECT IIF(1 < 2, 'TRUE') AS result1, IIF(1 > 2 , 'TRUE') AS result2;
result1 | result2
---------------+---------------
TRUE |null
可以组合 IIF 函数来实现更复杂的逻辑,从而模拟 CASE
表达式。例如
IIF(a = 1, 'one', IIF(a = 2, 'two', IIF(a = 3, 'three', 'many')))
ISNULL(
expression,
expression)
输入:
- 第一个表达式
- 第二个表达式
输出:如果第一个表达式为 null,则为第二个表达式,否则为第一个表达式。
描述:COALESCE
的变体,只有两个参数。返回其参数中第一个非 null 的参数。如果所有参数均为 null,则返回 null
。
SELECT ISNULL('elastic', null) AS "isnull";
isnull
---------------
elastic
SELECT ISNULL(null, 'search') AS "isnull";
isnull
---------------
search
LEAST(
expression,
expression,
...)
输入:
- 第一个表达式
- 第二个表达式
…
第N个表达式
LEAST 可以接受任意数量的参数,并且所有参数必须是相同的数据类型。
输出:其中一个表达式或 null
描述:返回具有最小值且非 null 的参数。如果所有参数均为 null,则返回 null
。
SELECT LEAST(null, 2, 1) AS "least";
least
---------------
1
SELECT LEAST(null, null, null, null) AS "least";
least
---------------
null
NULLIF(
expression,
expression)
输入:
- 第一个表达式
- 第二个表达式
输出:如果两个表达式相等,则为 null
,否则为第一个表达式。
描述:当两个输入表达式相等时返回 null
,否则返回第一个表达式。
SELECT NULLIF('elastic', 'search') AS "nullif";
nullif
---------------
elastic
SELECT NULLIF('elastic', 'elastic') AS "nullif";
nullif:s
---------------
null
NVL(
expression,
expression)
输入:
- 第一个表达式
- 第二个表达式
输出:如果第一个表达式为 null,则为第二个表达式,否则为第一个表达式。
描述:COALESCE
的变体,只有两个参数。返回其参数中第一个非 null 的参数。如果所有参数均为 null,则返回 null
。
SELECT NVL('elastic', null) AS "nvl";
nvl
---------------
elastic
SELECT NVL(null, 'search') AS "nvl";
nvl
---------------
search