历史版本。 PostgreSQL 7.4 已结束支持。 请参阅 当前版本手册.
9.12. 条件表达式 #
本节描述 PostgreSQL 中可用的 SQL 兼容的条件表达式。
提示
如果你的需求超过这些条件表达式的能力,你可能会希望用一种更富表现力的编程语言写一个存储过程。
9.12.1. CASE
SQL 的 CASE 表达式是一种通用的条件表达式,类似于其他语言中的 if/else 语句:
CASE WHENconditionTHENresult[WHEN ...] [ELSEresult] END
CASE 子句可以用于任何允许表达式的地方。condition 是一个返回 boolean 结果的表达式。如果结果为真,CASE 表达式的值就是该条件后面的 result。如果结果为假,则以相同的方式搜索后续的
WHEN 子句。如果没有
condition 为真的 WHEN
子句,则 case 表达式的值是
ELSE 子句中的 result。如果省略了 ELSE 子句且没有任何条件匹配,结果为空值。
示例:
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 表达式是上面一般形式的一个特化变体:
CASEexpressionWHENvalueTHENresult[WHEN ...] [ELSEresult] 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;