支持的版本:当前 (17) / 16 / 15 / 14 / 13
开发版本:devel
不支持的版本: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

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子句。如果没有WHENcondition产生真值,则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)

如果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. GREATESTLEAST #

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

GREATESTLEAST 函数从任意数量的表达式列表中选择最大值或最小值。这些表达式必须全部可转换为通用数据类型,这将是结果的类型(有关详细信息,请参阅第 10.5 节)。

将忽略参数列表中的 NULL 值。仅当所有表达式都计算为 NULL 时,结果才为 NULL。(这是与 SQL 标准的偏差。根据标准,如果任何参数为 NULL,则返回值也为 NULL。某些其他数据库的行为方式就是这样。)

提交更正

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