2016-04-17 4 views
1

Это из официальной документации (http://www.postgresql.org/docs/9.4/static/plpgsql-control-structures.html)PostgreSQL сазе

и две формы корпуса:

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/pgSQL с номером SQL. Вы ссылаетесь на руководство для PL/pgSQL, но ваш код отображает выражение SQL.

Оба используют ключевое слово CASE, но это не то же самое. CASE в PL/pgSQL является структурой управления для процедурного языка, тогда как CASE в SQL является условным выражением .

Вы не первый, кого следует смутить. Существуют и другие незначительные различия в синтаксисе. Так, например, 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: О, интересно, это может быть невысокое зависание для амбициозного разработчика. –

Смежные вопросы