本节描述了以下内容SQL- 在 PostgreSQL 中可用的符合条件的表达式。
如果您的需求超出了这些条件表达式的能力,则可以考虑使用更具表现力的编程语言编写服务器端函数。
尽管 COALESCE
、GREATEST
和 LEAST
在语法上与函数相似,但它们并不是普通函数,因此无法与显式的 VARIADIC
数组参数一起使用。
CASE
#该SQL CASE
表达式是一个通用的条件表达式,类似于其他编程语言中的 if/else 语句
CASE WHENcondition
THENresult
[WHEN ...] [ELSEresult
] END
CASE
子句可用于表达式有效之处。每个 condition
都是返回 boolean
结果的表达式。如果条件的结果为 true,CASE
表达式的值就是条件后面的 result
,并且 CASE
表达式的其余部分不会继续处理。如果条件的结果为 false,则对任何后续 WHEN
子句以相同的方式进行检查。如果没有 WHEN
condition
产生 true,则 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)') ...
如果它不为 null,则返回 description
;否则如果它不为 null,则返回 short_description
;否则返回 (none)
。
所有自变量都必须可转换为公共数据类型,该类型为结果类型(有关详细信息,请参见 第 10.5 节)。
与 CASE
表达式类似,COALESCE
仅计算确定结果所需的自变量;也就是说,不计算第一个非 Null 自变量右侧的自变量。此 SQL 标准函数提供与 NVL
和 IFNULL
类似的功能,而 NVL
和 IFNULL
在其他某些数据库系统中使用。
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
运算符。