条件函数和表达式
编辑条件函数和表达式
编辑通过以 if-else 方式求值来返回其参数之一的函数。
CASE
编辑概要
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
所有结果表达式必须具有兼容的数据类型。更具体地说,所有结果表达式都应具有与第一个 *非 null* 结果表达式兼容的数据类型。例如
对于以下查询
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* 都落入 *multilingual* 桶中。
COALESCE
编辑概要
输入:
……
第 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
编辑概要
输入:
……
第 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
编辑概要
输入:
输出:如果第一个表达式为 null,则为第二个表达式,否则为第一个表达式。
描述:COALESCE
的变体,仅有两个参数。返回其参数中第一个不为 null 的参数。如果所有参数都为 null,则返回 null
。
SELECT IFNULL('elastic', null) AS "ifnull"; ifnull --------------- elastic
SELECT IFNULL(null, 'search') AS "ifnull"; ifnull --------------- search
IIF
编辑概要
输入:
输出:如果第一个表达式(条件)求值为 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
编辑概要
输入:
输出:如果第一个表达式为 null,则为第二个表达式,否则为第一个表达式。
描述:COALESCE
的变体,仅有两个参数。返回其参数中第一个不为 null 的参数。如果所有参数都为 null,则返回 null
。
SELECT ISNULL('elastic', null) AS "isnull"; isnull --------------- elastic
SELECT ISNULL(null, 'search') AS "isnull"; isnull --------------- search
LEAST
编辑概要
输入:
……
第 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
编辑概要
输入:
输出:如果两个表达式相等,则为 null
,否则为第一个表达式。
描述:当两个输入表达式相等时返回 null
,否则返回第一个表达式。
SELECT NULLIF('elastic', 'search') AS "nullif"; nullif --------------- elastic
SELECT NULLIF('elastic', 'elastic') AS "nullif"; nullif:s --------------- null