本节介绍 PostgreSQL 中提供的符合 SQL 标准的条件表达式。SQL-compliant conditional expressions available in PostgreSQL.
如果您的需求超出了这些条件表达式的能力范围,您可以考虑用更具表达力的编程语言编写服务器端函数。
虽然 COALESCE
、GREATEST
和 LEAST
在语法上类似于函数,但它们不是普通函数,因此不能与显式的 VARIADIC
数组参数一起使用。
CASE
#该SQL CASE
表达式是一个通用的条件表达式,类似于其他编程语言中的 if/else 语句。
CASE WHENcondition
THENresult
[WHEN ...] [ELSEresult
] END
CASE
子句可以用于任何有效表达式的地方。每个 condition
都是一个返回 boolean
结果的表达式。如果条件的结果为 true,则 CASE
表达式的值是紧跟在条件后面的 result
,并且 CASE
表达式的其余部分将不被处理。如果条件的结果不为 true,则会以相同的方式检查后续的 WHEN
子句。如果没有 WHEN
condition
产生 true,则 CASE
表达式的值是 ELSE
子句的 result
。如果省略了 ELSE
子句且没有条件为 true,则结果为 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
。
如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表格 报告文档问题。