On this page
9.17. 条件表达式
本节描述了 PostgreSQL 中可用的 SQL 兼容条件表达式。
Tip
如果您的需求超出了这些条件表达式的能力,则可能需要考虑使用更具表现力的编程语言编写存储过程。
9.17.1. CASE
SQL CASE
表达式是通用条件表达式,类似于其他编程语言中的 if/else 语句:
CASE WHEN condition THEN result
[WHEN ...]
[ELSE result]
END
表达式有效的任何地方都可以使用CASE
子句。每个* condition
是一个返回boolean
结果的表达式。如果条件的结果为 true,则CASE
表达式的值是紧随该条件的 result
*,并且不处理CASE
表达式的其余部分。如果条件的结果不正确,则以相同方式检查所有后续的WHEN
子句。如果没有WHEN
* condition
得出 true,则CASE
表达式的值是ELSE
子句的 result
*。如果省略ELSE
子句且没有条件为真,则结果为 null。
An example:
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
*表达式的数据类型必须可转换为单个输出类型。有关更多详细信息,请参见Section 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;
Note
如Section 4.2.14中所述,在各种情况下都会在不同的时间评估表达式的子表达式,因此“ CASE
仅评估必要的子表达式”的原理并没有被牢记。例如,恒定的1/0
子表达式通常会在计划时导致除数为零的故障,即使它在运行时永远不会 Importing 的CASE
分支中也是如此。
9.17.2. COALESCE
COALESCE(value [, ...])
COALESCE
函数返回其第一个不为 null 的参数。仅当所有参数均为 null 时,才返回 Null。在检索数据进行显示时,通常用它来用默认值代替空值,例如:
SELECT COALESCE(description, short_description, '(none)') ...
如果不为空,则返回description
;否则为short_description
,否则为(none)
。
像CASE
表达式一样,COALESCE
仅评估确定结果所需的参数。也就是说,不评估第一个非空参数右边的参数。此 SQL 标准函数提供的功能类似于NVL
和IFNULL
,它们在某些其他数据库系统中使用。
9.17.3. NULLIF
NULLIF(value1, value2)
如果* value1
等于 value2
,则NULLIF
函数返回空值;否则返回 value1
*。这可以用来执行上面给出的COALESCE
示例的逆运算:
SELECT NULLIF(value, '(none)') ...
在此示例中,如果value
为(none)
,则返回 null,否则返回value
的值。
9 .17.4. 最大和最小
GREATEST(value [, ...])
LEAST(value [, ...])
GREATEST
和LEAST
函数从任意数量的表达式列表中选择最大值或最小值。表达式必须全部可转换为通用数据类型,该类型将成为结果的类型(有关详细信息,请参见Section 10.5)。列表中的 NULL 值将被忽略。仅当所有表达式的计算结果均为 NULL 时,结果才为 NULL。
请注意,GREATEST
和LEAST
不在 SQL 标准中,而是常见的 extensions。如果某些参数为 NULL,则某些其他数据库使它们返回 NULL,而不是仅当所有参数均为 NULL 时才返回 NULL。