Использование PostgreSQL CASE в функциях - PullRequest
14 голосов
/ 19 января 2012

Разве мы не можем использовать CASE условие вне операторов SQL SELECT?

например:.

CASE 
  WHEN old.applies_to = 'admin' THEN _applies_to = 'My Self'
  ELSE _applies_to = initcap(old.applies_to)
END
 _summary = _summary || '<li>Apply To: ' || _applies_to || '</li>';

Я получаю следующую ошибку:

ERROR:  syntax error at or near "_summary"
LINE 86: _summary = _summary || '<li>Apply To: ' || _applies ...

1 Ответ

18 голосов
/ 19 января 2012

Это относится к структуре условного управления CASE процедурного языка PL / pgSQL , предназначенной для использования в функциях plpgsql или DO заявления .Не следует путать с CASE выражением SQL .Другой язык!И немного разные синтаксические правила тоже.

Несмотря на то, что SQL CASE может быть встроен в выражения SQL внутри кода PL / pgSQL (который в основном является просто клеем для команд SQL), вы не можете иметь автономные выражения SQL CASE (было бы бессмысленно).

-- inside plpgsql code block:
CASE 
   WHEN old.applies_to = 'admin' THEN
      _applies_to := 'My Self';
   ELSE
      _applies_to := initcap(old.applies_to);
END CASE;

Вы должны использовать полностью определенные операторы, заканчивающиеся точкой с запятой (;) и END CASE, чтобы закрыть его.

Ответ на дополнительный вопрос в комментарии

Согласно документации ключевое слово ELSE оператора CASE является , а не необязательным.Я цитирую по ссылке выше:

Если совпадений не найдено, операторы ELSE выполняются;но если ELSE отсутствует, то возникает исключение CASE_NOT_FOUND.

Однако вы можете использовать пустое ELSE:

CASE 
   WHEN old.applies_to = 'admin' THEN
      _applies_to := 'My Self';
   ELSE
      --  do nothing
END CASE;

Это другоеиз выражений SQL CASE, где ELSE является необязательным, но если ключевое слово присутствует, выражение также должно быть задано!

...