↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 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
历史版本。 PostgreSQL 13 已结束支持。 2025-11-13. 请参阅 当前版本手册.

9.18. 条件表达式 #

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

提示

如果你的需求超过这些条件表达式的能力,你可能会希望用一种更富表现力的编程语言写一个服务器端函数。

注意

尽管 COALESCE、GREATEST 和 LEAST 在语法上类似于函数,但它们不是普通的函数,因此不能使用显式 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,否则返回 short_description,前提是它不为 null,否则返回(none)。

所有参数都必须能转换为同一个数据类型,它将是结果的类型(详情参见第 10.5 节)。

和 CASE 表达式一样,COALESCE 只计算确定结果所需的参数;也就是说,在第一个不为 null 的参数右边的参数不会被计算。这个 SQL 标准函数提供了类似于 NVL 和 IFNULL 的能力,它们被用在某些其他数据库系统中。

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. GREATEST 和 LEAST #

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

GREATEST 和 LEAST 函数从由任意数量的表达式组成的列表中选取最大值或最小值。这些表达式都必须能转换为同一个数据类型,该类型将作为结果类型(详情参见第 10.5 节)。列表中的 NULL 值会被忽略。只有所有表达式的求值结果都为 NULL 时,结果才为 NULL。

请注意 GREATEST 和 LEAST 都未包含在 SQL 标准中,但却是很常见的扩展。某些其他数据库让它们在任何参数为 NULL 时返回 NULL,而不是在所有参数都为 NULL 时才返回 NULL。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.