4.12. 条件表达式 #
本节描述 PostgreSQL 中可用的 SQL 兼容的条件表达式。
提示
如果你的需求超过这些条件表达式的能力,你可能会希望用一种更富表现力的编程语言写一个存储过程。
CASE
CASE WHENconditionTHENresult[WHEN ...] [ELSEresult] END
SQL 的 CASE 表达式是一种通用的条件表达式,类似于其他语言中的 if/else 语句。CASE 子句可以用于任何允许表达式的地方。condition 是一个返回 boolean 结果的表达式。如果结果为真,CASE 表达式的值就是
result。如果结果为假,则以相同的方式搜索后续的
WHEN 子句。如果没有
condition 为真的
WHEN 子句,则 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 表达式的数据类型都必须能强制转换为一个单一的输出类型。更多细节参见第 5.6 节。
CASEexpressionWHENvalueTHENresult[WHEN ...] [ELSEresult] END
这个“简单”的 CASE 表达式是上面一般形式的一个特化变体。expression 被计算并与
WHEN 子句中的所有
value 比较,直到找到一个相等的。如果没有找到匹配,则返回
ELSE 子句中的
result(或 NULL)。
上面的例子可以用简单的
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
COALESCE
COALESCE(value[, ...])
COALESCE 函数返回它的第一个非 NULL 参数。这在为显示检索数据时用默认值替换 NULL 值常常很有用,例如:
SELECT COALESCE(description, short_description, '(none)') ...
NULLIF
NULLIF(value1,value2)
当且仅当 value1 和
value2 相等时,NULLIF 函数返回 NULL。否则它返回
value1。它可用于执行与上面给出的
COALESCE 例子相反的操作:
SELECT NULLIF(value, '(none)') ...
提示
COALESCE 和 NULLIF 只是
CASE 表达式的缩写。它们实际上在处理的非常早期阶段就被转换为
CASE 表达式,后续处理认为自己在处理
CASE。因此,不正确地使用 COALESCE 或
NULLIF 可能会得到引用
CASE 的错误消息。