↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 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 7.3 已于 2007 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

6.12. 条件表达式 #

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

提示

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

6.12.1. CASE

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

SQL 的 CASE 表达式是一种 通用的条件表达式,类似于其他语言中的 if/else 语句。 CASE 子句可以用于任何 允许表达式的地方。condition 是一个 返回 boolean 结果的表达式。如果结果为真, CASE 表达式的值就是 result。如果结果为假, 则以相同的方式搜索后续的 WHEN 子句。如果没有 condition 为真的 WHEN 子句,则 case 表达式的值是 ELSE 子句中的 result。如果省略了 ELSE 子句 且没有任何条件匹配,结果为空值。

一个例子:

=> 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 表达式的 数据类型都必须能强制转换为一个单一的输出类型。 更多细节参见第 7.5 节。

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

这个“简单”的 CASE 表达式是 上面一般形式的一个特化变体。 expression 被计算并与 WHEN 子句中的所有 value 比较,直到找到一个相等的。如果 没有找到匹配,则返回 ELSE 子句中的 result(或空值)。这类似于 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

6.12.2. COALESCE

COALESCE(value [, ...])

COALESCE 函数返回它的第一个 非空参数。这在为显示检索数据时用 默认值替换空值常常很有用, 例如:

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

6.12.3. NULLIF

NULLIF(value1, value2)

当且仅当 value1 和 value2 相等时, NULLIF 函数返回空值。否则它返回 value1。它可用于执行与上面给出的 COALESCE 例子相反的操作:

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

提示

COALESCE 和 NULLIF 只是 CASE 表达式的缩写。它们实际上 在处理的非常早期阶段就被转换为 CASE 表达式,后续处理认为自己在处理 CASE。因此,不正确地使用 COALESCE 或 NULLIF 可能会得到引用 CASE 的错误消息。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。