9.18. 条件表达式#
本节介绍PostgreSQL中可用的符合SQL标准的条件表达式。
提示
如果您的需求超出了这些条件表达式的功能,您可能需要考虑使用更具表现力的编程语言编写服务器端函数。
注意
尽管COALESCE
、GREATEST
和LEAST
在语法上与函数类似,但它们不是普通函数,因此不能与显式VARIADIC
数组参数一起使用。
9.18.1.CASE
#
SQLCASE
表达式是一个通用的条件表达式,类似于其他编程语言中的 if/else 语句
CASE WHEN condition THEN result
[WHEN ...]
[ELSE result]
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
表达式的““简单””形式,它是上述通用形式的变体
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;
注意
如第 4.2.14 节中所述,在各种情况下,表达式的子表达式在不同时间计算,因此““CASE
仅计算必要的子表达式””这一原则并非铁定不变。例如,一个常量1/0
子表达式通常会在规划时导致除以零失败,即使它位于运行时永远不会进入的CASE
分支中。
9.18.2.COALESCE
#
COALESCE(value [, ...])
COALESCE
函数返回其第一个非空参数。仅当所有参数都为空时才返回空值。它通常用于在检索数据以进行显示时用默认值替换空值,例如
SELECT COALESCE(description, short_description, '(none)') ...
如果description
不为空,则返回description
,否则如果short_description
不为空,则返回short_description
,否则返回(none)
。
所有参数都必须可以转换为公共数据类型,该数据类型将是结果的类型(有关详细信息,请参见第 10.5 节)。
与CASE
表达式类似,COALESCE
仅计算确定结果所需的那些参数;也就是说,不会计算第一个非空参数右侧的参数。此 SQL 标准函数提供了与NVL
和IFNULL
类似的功能,这些功能在其他一些数据库系统中使用。
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.GREATEST
和LEAST
#
GREATEST(value [, ...])
LEAST(value [, ...])
GREATEST
和LEAST
函数从任意数量的表达式列表中选择最大或最小值。这些表达式都必须可转换为通用数据类型,该类型将是结果的类型(有关详细信息,请参见第 10.5 节)。
参数列表中的 NULL 值将被忽略。仅当所有表达式都计算为 NULL 时,结果才会为 NULL。(这与 SQL 标准不同。根据该标准,如果任何参数为 NULL,则返回值为 NULL。其他一些数据库的行为与此相同。)