2016-04-17 61 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:哦,有趣的是,對於一個雄心勃勃的開發人員來說,這可能是低掛的。 –