2016-04-17 10 views
1

Diese von der offiziellen Dokumentation (http://www.postgresql.org/docs/9.4/static/plpgsql-control-structures.html)PostgreSQL CASE-Anweisung

und zwei Formen von CASE:

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

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

Dies funktioniert nicht:

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

Es arbeitet mit end statt end case, aber:

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

Dies ist mit PostgreSQL 9.4.6.

Warum stimmt die Syntax in der offiziellen Dokumentation nicht mit der Syntax überein, die der Server anscheinend benötigt?

Antwort

3

Sie verwechseln Dokumentation für PL/pgSQL mit der für SQL. Sie verlinken auf das Handbuch für PL/pgSQL, aber Ihr Code zeigt einen SQL-Ausdruck an.

Beide verwenden das Schlüsselwort CASE, aber es ist nicht das Gleiche. CASE in PL/pgSQL ist eine Steuerelementstruktur für die prozedurale Sprache, während CASE in SQL ist eine bedingte Ausdruck.

Sie sind nicht die Ersten, die verwirrt sind. Es gibt noch andere geringfügige Unterschiede in der Syntax. Zum Beispiel PL/pgSQL ermöglicht eine Liste von Werten für die "simple CASE" variant, was nicht möglich in SQL ist:

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

Wäre schön, in SQL zu haben, wie gut, aber der Standard es nicht zulässt, dass und Postgres hält sich an den Standard.

+1

Moderne SQL erlaubt Liste von Ausdruck in SQL 'CASE' auch. Die Prozedur 'CASE' basiert auf dem modernen Standard, SQL' CASE' ist immer noch ANSI SQL 99 konform (fehlende optionale Funktion F263). Der Grund, warum SQL 'CASE' dieses Feature vermisst, ist einfach - kein Body hat es für Postgres geschrieben. –

+0

@PavelStehule: Oh, interessant, dies könnte für einen ambitionierten Entwickler ein wenig hängen bleiben. –