2016-04-17 63 views
1

这是从官方文档(http://www.postgresql.org/docs/9.4/static/plpgsql-control-structures.htmlPostgreSQL的CASE语句

和两种形式的CASE:

CASE ... WHEN ... THEN ... ELSE ... END CASE

CASE WHEN ... THEN ... ELSE ... END CASE

这不起作用:

select case when 1 < 2 then 'a' else 'b' end case from pg_database limit 1; 

它与end代替end case,虽然:

select case when 1 < 2 then 'a' else 'b' end from pg_database limit 1; 

这是在PostgreSQL 9.4.6。

为什么官方文档中的语法与服务器明显需要的语法不匹配?

回答

3

你在为PL/pgSQLSQL的文件混淆。您链接到PL/pgSQL手册,但您的代码显示一个SQL表达式。

两者都使用关键词CASE,但它不是一回事。 PL/pgSQL中的CASE控制结构用于过程语言,而SQL中的CASE是条件表达式

你不是第一个被弄糊涂的人。语法中还有其他细微差异。例如,PL/pgSQL的允许值,为"simple CASE" variant一个列表,这是不可能在SQL:

... WHEN expression [, expression [ ... ]] THEN 

将是不错的有SQL为好,但标准不允许它和Postgres坚持标准。

+1

现代SQL也允许SQL'CASE'中的表达式列表。程序'CASE'基于现代标准,SQL' CASE'仍然符合ANSI SQL 99(缺少可选功能F263)。原因,为什么SQL CASE缺少这个功能很简单 - 没有人为Postgres写它。 –

+0

@PavelStehule:哦,有趣的是,对于一个雄心勃勃的开发人员来说,这可能是低挂的。 –