Postgresql 中文操作指南

9.18. Conditional Expressions #

此部分介绍 PostgreSQL 中可用的 SQL 兼容条件表达式。

Tip

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

Note

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

9.18.1. CASE #

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

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

CASE 子句可以在任何表达式有效的地方使用。每个 condition 都是返回 boolean 结果的表达式。如果条件的结果为真,则 CASE 表达式的值为条件后的 result,并且不会处理 CASE 表达式的其余部分。如果条件的结果不为真,则以相同的方式检查任何后续 WHEN 子句。如果没有 WHEN condition 生成真,则 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_表达式的类型必须可转换为单个输出类型。有关更多详细信息,请参阅 Section 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;

Note

Section 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)

所有参数都必须可转换为公共数据类型,该类型将是结果的类型(有关详细信息,请参阅 Section 10.5)。

CASE 表达式一样,COALESCE 仅计算确定结果所需的参数;也就是说,不会计算第一个非空参数右侧的参数。此 SQL 标准函数提供了类似于 NVLIFNULL 的功能,后者在一些其他数据库系统中使用。

9.18.3. NULLIF #

NULLIF(value1, value2)

如果 value1 等于 value2,则 NULLIF 函数返回一个空值;否则,返回 value1。这可用于对上面给出的 COALESCE 示例执行逆操作:

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

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

两个参数必须为可比较类型。具体而言,它们之间的比较完全等同于编写 value1 = value2 ,因此必须有合适的 = 操作符可用。

结果与第一个参数的类型相同——但有微妙之处。实际返回的是隐式 = 运算符的第一个参数,并且在某些情况下,它会被提升为匹配第二个参数的类型。例如,NULLIF(1, 2.2) 会生成 numeric,因为没有 integer = numeric 运算符,只有 numeric = numeric

9.18.4. GREATEST and LEAST #

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

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

参数列表中的 NULL 值会被忽略。仅当所有表达式都计算为 NULL 时,结果才会为 NULL。(这与 SQL 标准不同。根据标准,如果任何参数为 NULL,则返回值为 NULL。其他某些数据库也遵循这种方式。)