2024年9月26日: PostgreSQL 17 发布!
支持版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不受支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

9.18. 条件表达式 #

本节描述SQL- 兼容的条件表达式,可在 PostgreSQL 中使用。

提示

如果您需要超越这些条件表达式的功能,您可能需要考虑用更具表达力的编程语言编写服务器端函数。

注意

虽然 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 表达式的 数据类型都必须可转换为单个输出类型。有关详细信息,请参见 第 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)') ...

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

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

CASE 表达式类似,COALESCE 只评估确定结果所需的那些参数;也就是说,不会评估第一个非 null 参数右侧的参数。此 SQL 标准函数提供了类似于 NVLIFNULL 的功能,这些功能在某些其他数据库系统中使用。

9.18.3. NULLIF #

NULLIF(value1, value2)

NULLIF 函数如果 value1 等于 value2,则返回 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。一些其他数据库的行为与此相同。)

提交更正

如果您在文档中发现任何不正确的内容、与您对特定功能的体验不符或需要进一步澄清,请使用 此表格 报告文档问题。