Использование PostgreSQL CASE в функциях

Не можем ли мы использовать условие 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

Это касается условной структуры управления 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 исключение CASE_NOT_FOUND.

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

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

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