Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

9.18. 条件表达式 #

9.18.1. CASE
9.18.2. COALESCE
9.18.3. NULLIF
9.18.4. GREATESTLEAST

本节描述了以下内容SQL- 在 PostgreSQL 中可用的符合条件的表达式。

提示

如果您的需求超出了这些条件表达式的能力,则可以考虑使用更具表现力的编程语言编写服务器端函数。

注意

尽管 COALESCEGREATESTLEAST 在语法上与函数相似,但它们并不是普通函数,因此无法与显式的 VARIADIC 数组参数一起使用。

9.18.1. CASE #

SQL CASE 表达式是一个通用的条件表达式,类似于其他编程语言中的 if/else 语句

CASE WHEN condition THEN result
     [WHEN ...]
     [ELSE result]
END

CASE 子句可用于表达式有效之处。每个 condition 都是返回 boolean 结果的表达式。如果条件的结果为 true,CASE 表达式的值就是条件后面的 result,并且 CASE 表达式的其余部分不会继续处理。如果条件的结果为 false,则对任何后续 WHEN 子句以相同的方式进行检查。如果没有 WHEN condition 产生 true,则 CASE 表达式的值就是 ELSE 子句的 result。如果 ELSE 子句被忽略并且没有条件为真,则结果为 null。

一个示例

SELECT * FROM test;

 a
---
 1
 2
 3


SELECT a,
       CASE WHEN a=1 THEN 'one'
            WHEN a=2 THEN 'two'
            ELSE 'other'
       END
    FROM test;

 a | case
---+-------
 1 | one
 2 | two
 3 | other

所有 result 表达式的类型都必须可转换为单一输出类型。有关更多详细信息,请参阅 第 10.5 节

简单形式的 CASE 表达式,它是上述一般形式的变量

CASE expression
    WHEN value THEN result
    [WHEN ...]
    [ELSE result]
END

首先计算 expression,然后将它与 WHEN 子句中每个 value 表达式进行比较,直至找到一个与其相等的表达式。如果没有找到匹配,则返回 ELSE 子句的 result(或一个 null 值)。这与 C 中的 switch 语句相似。

上述示例可以使用简单 CASE 语法编写

SELECT a,
       CASE a WHEN 1 THEN 'one'
              WHEN 2 THEN 'two'
              ELSE 'other'
       END
    FROM test;

 a | case
---+-------
 1 | one
 2 | two
 3 | other

CASE 表达式不会评估确定结果不必要的所有子表达式。例如,这是避免除以零失败的一种可能方法

SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;

注意

第 4.2.14 节 所述,存在各种情况下表达式的子表达式会在不同时间进行评估,因此“CASE 只评估必要的子表达式”” 的原则并非铁板一块。例如,常量 1/0 子表达式通常会在计划时间导致除以零失败,即使它在一个运行时永远不会进入的 CASE 分支中。

9.18.2.  COALESCE #

COALESCE(value [, ...])

COALESCE 函数返回第一个非 null 参数。只有当所有参数均为 null 时才返回 null。例如,用于在检索数据以显示时用默认值替换 null 值时,经常使用它

SELECT COALESCE(description, short_description, '(none)') ...

如果它不为 null,则返回 description;否则如果它不为 null,则返回 short_description;否则返回 (none)

所有自变量都必须可转换为公共数据类型,该类型为结果类型(有关详细信息,请参见 第 10.5 节)。

CASE 表达式类似,COALESCE 仅计算确定结果所需的自变量;也就是说,不计算第一个非 Null 自变量右侧的自变量。此 SQL 标准函数提供与 NVLIFNULL 类似的功能,而 NVLIFNULL 在其他某些数据库系统中使用。

9.18.3. NULLIF #

NULLIF(value1, value2)

value1 等于 value2 时,NULLIF 函数返回 null 值;否则返回 value1。这可用于执行上面给出的 COALESCE 示例的逆运算

SELECT NULLIF(value, '(none)') ...

在此示例中,如果 value(none),则返回 null;否则返回 value 的值。

这两个自变量必须是可比较的类型。具体来说,它们的比较完全就像你编写 value1 = value2 一样,因此必须提供合适的 = 运算符。

结果与第一个自变量具有相同的类型——但这里有一个微妙之处。实际返回的是隐含的 = 运算符的第一个自变量,在某些情况下将提升该自变量以匹配第二个自变量的类型。例如,NULLIF(1, 2.2) 会产生 numeric,因为没有 integer = numeric 运算符,只有 numeric = numeric 运算符。

9.18.4. GREATESTLEAST #

GREATEST(value [, ...])
LEAST(value [, ...])

GREATESTLEAST 函数从任意数量的表达式列表中选择最大值或最小值。所有表达式都必须可转换为公共数据类型,该类型为结果类型(有关详细信息,请参见 第 10.5 节)。

自变量列表中的 NULL 值将被忽略。仅当所有表达式都计算为 NULL 时,结果才会为 NULL。(这是一个偏离 SQL 标准之处。根据该标准,如果任何自变量为 NULL,则返回值为 NULL。一些其他数据库的行为方式与此相同。)