pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
本节描述在PostgreSQL中可用的SQL兼容的条件表达式。
如果你的需求超过这些条件表达式的能力,你可能会希望用一种更富表现力的编程语言写一个存储过程。
CASESQL CASE表达式是一种通用的条件表达式,类似于其它编程语言中的 if/else 语句:
CASE WHENconditionTHENresult[WHEN ...] [ELSEresult] END
CASE子句可以用于任何表达式有效的地方。condition是一个返回boolean结果的表达式。如果结果为真,那么CASE表达式的值就是紧随该条件之后的result。如果结果为假,那么以相同的方式搜寻任何随后的WHEN子句。如果没有WHEN condition为真,那么 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表达式是上述通用形式的一个变种:
CASEexpressionWHENvalueTHENresult[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;
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。