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

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 7.4 已结束支持。 请参阅 当前版本手册.

9.12. 条件表达式 #

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

提示

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

9.12.1. CASE

SQL 的 CASE 表达式是一种通用的条件表达式,类似于其他语言中的 if/else 语句:

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

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表达式的数据类型都必须可以转换成单一的输出类型。参阅第 10.5 节获取细节。

下面的“简单” CASE 表达式是上面一般形式的一个特化变体:

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

先计算 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

CASE表达式并不计算任何无助于判断结果的子表达式。例如,下面是一个可以避免被零除错误的方法:

SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;

9.12.2. COALESCE

COALESCE(value [, ...])

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

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

和CASE表达式一样,COALESCE只计算确定结果所需的参数;也就是说,在第一个不为 null 的参数右边的参数不会被计算。

9.12.3. NULLIF

NULLIF(value1, value2)

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

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

报告文档问题

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