选择 打开 改范围 完整检索页

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
历史版本PostgreSQL 9.1 已于 2016 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

9.16. 条件表达式 #

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

提示

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

9.16.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.16.2. COALESCE #

COALESCE(value [, ...])

COALESCE函数返回其参数中第一个非空的值。只有当所有参数都为空时才返回空。它常用于在为显示而检索数据时为空值替换一个默认值,例如:

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

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

9.16.3. NULLIF #

NULLIF(value1, value2)

value1value2相等时,NULLIF返回 null。 否则它返回value1。 这些可以用于执行前文给出的COALESCE示例的逆操作:

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

在这个示例中,如果value(none),将返回 null,否则返回value的值。

9.16.4. GREATESTLEAST #

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

GREATESTLEAST函数从一个任意数量的表达式列表中选出最大或最小的值。这些表达式必须都能转换为一个公共数据类型,该类型也就是结果的类型(细节见第 10.5 节)。列表中的空值会被忽略。只有当所有表达式都计算为空时,结果才为空。

注意,GREATESTLEAST不在 SQL 标准中,但它们是一种常见的扩展。有些其他数据库让它们在任一参数为空时就返回空,而不是只在全部参数都为空时才返回空。

提交更正

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