本节描述SQL- 兼容的条件表达式,可在 PostgreSQL 中使用。
如果您需要超越这些条件表达式的功能,您可能需要考虑用更具表达力的编程语言编写服务器端函数。
虽然 COALESCE
、GREATEST
和 LEAST
在语法上类似于函数,但它们不是普通的函数,因此不能与显式 VARIADIC
数组参数一起使用。
CASE
#该SQL CASE
表达式是一种通用的条件表达式,类似于其他编程语言中的 if/else 语句。
CASE WHENcondition
THENresult
[WHEN ...] [ELSEresult
] 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
表达式,它是上述一般形式的变体。
CASEexpression
WHENvalue
THENresult
[WHEN ...] [ELSEresult
] 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
分支中。
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 标准函数提供了类似于 NVL
和 IFNULL
的功能,这些功能在某些其他数据库系统中使用。
NULLIF
#NULLIF
(value1
,value2
)
NULLIF
函数如果 value1
等于 value2
,则返回 null 值;否则,返回 value1
。这可用于执行上述 COALESCE
示例的逆运算。
SELECT NULLIF(value, '(none)') ...
在此示例中,如果 value
为 (none)
,则返回 null;否则,返回 value
的值。
这两个参数必须是可比较的类型。具体来说,它们是按你写
的方式进行比较的,因此必须有一个合适的 value1
= value2
=
运算符可用。
结果与第一个参数的类型相同 - 但有一个细微之处。实际返回的是隐含的 =
运算符的第一个参数,在某些情况下,它将被提升以匹配第二个参数的类型。例如,NULLIF(1, 2.2)
产生 numeric
,因为没有 integer
=
numeric
运算符,只有 numeric
=
numeric
。
如果您在文档中发现任何不正确的内容、与您对特定功能的体验不符或需要进一步澄清,请使用 此表格 报告文档问题。