条件函数和表达式

编辑

以 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 语句。如果条件的结果为真,则跟随条件的结果表达式的值将被返回,随后的 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

作为一种变体,可以使用类似于其他编程语言中 switch-case 的语法来表达 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 都将落入 multilingual 分桶。

COALESCE

编辑

概要

COALESCE(
    expression, 
    expression, 
    ...)

输入:

第一个表达式

第二个表达式

…​

N个表达式

COALESCE 可以接受任意数量的参数。

输出: 表达式之一或 null

描述: 返回其第一个非空参数。如果所有参数都为空,则返回 null

SELECT COALESCE(null, 'elastic', 'search') AS "coalesce";

    coalesce
---------------
elastic
SELECT COALESCE(null, null, null, null) AS "coalesce";

    coalesce
---------------
null

GREATEST

编辑

概要

GREATEST(
    expression, 
    expression, 
    ...)

输入:

第一个表达式

第二个表达式

…​

N个表达式

GREATEST 可以接受任意数量的参数,并且所有参数都必须具有相同的数据类型。

输出: 表达式之一或 null

描述: 返回具有最大值且非空的的参数。如果所有参数都为空,则返回 null

SELECT GREATEST(null, 1, 2) AS "greatest";

    greatest
---------------
2
SELECT GREATEST(null, null, null, null) AS "greatest";

    greatest
---------------
null

IFNULL

编辑

概要

IFNULL(
    expression, 
    expression) 

输入:

第一个表达式

第二个表达式

输出: 如果第一个表达式为空,则为第二个表达式;否则为第一个表达式。

描述: COALESCE 的变体,只有两个参数。返回其第一个非空参数。如果所有参数都为空,则返回 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

编辑

概要

ISNULL(
    expression, 
    expression) 

输入:

第一个表达式

第二个表达式

输出: 如果第一个表达式为空,则为第二个表达式;否则为第一个表达式。

描述: COALESCE 的变体,只有两个参数。返回其第一个非空参数。如果所有参数都为空,则返回 null

SELECT ISNULL('elastic', null) AS "isnull";

    isnull
---------------
elastic
SELECT ISNULL(null, 'search') AS "isnull";

    isnull
---------------
search

LEAST

编辑

概要

LEAST(
    expression, 
    expression, 
    ...)

输入:

第一个表达式

第二个表达式

…​

N个表达式

LEAST 可以接受任意数量的参数,并且所有参数都必须具有相同的数据类型。

输出: 表达式之一或 null

描述: 返回具有最小值且非空的的参数。如果所有参数都为空,则返回 null

SELECT LEAST(null, 2, 1) AS "least";

    least
---------------
1
SELECT LEAST(null, null, null, null) AS "least";

    least
---------------
null

NULLIF

编辑

概要

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) 

输入:

第一个表达式

第二个表达式

输出: 如果第一个表达式为空,则为第二个表达式;否则为第一个表达式。

描述: COALESCE 的变体,只有两个参数。返回其第一个非空参数。如果所有参数都为空,则返回 null

SELECT NVL('elastic', null) AS "nvl";

    nvl
---------------
elastic
SELECT NVL(null, 'search') AS "nvl";

    nvl
---------------
search