web-dev-qa-db-ja.com

関数でのPostgreSQLCASEの使用

SQL CASEステートメントの外部で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 ...
16

これは、 plpgsql関数 または-で使用される 手続き型言語PL/pgSQL条件付き制御構造CASE に関係します。 DOステートメントSQLのCASE と混同しないでください。別の言語!また、微妙に異なる構文規則もあります。

SQL CASEはPL/pgSQLコード内のSQL式に埋め込むことができますが(ほとんどの場合、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キーワードはnotオプションです。上記のリンクから引用します:

一致するものが見つからない場合、ELSEステートメントが実行されます。ただし、ELSEが存在しない場合は、CASE_NOT_FOUND例外が発生します。

ただし、空のELSEを使用できます。

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

これは、CASEがオプションであるSQLELSE式とは異なりますが、キーワードが存在する場合は、式も指定する必要があります。

20