考えていたのと同じように単純化します。
DO
$do$
BEGIN
IF NOT EXISTS (
SELECT FROM pg_catalog.pg_roles -- SELECT list can be empty for this
WHERE rolname = 'my_user') THEN
CREATE ROLE my_user LOGIN PASSWORD 'my_password';
END IF;
END
$do$;
(@a_horse_with_no_nameの回答に基づいて構築され、@ Gregoryのコメントで改善されました。)
たとえば、 CREATE TABLEとは異なります IF NOT EXISTSはありません CREATE ROLEの句 (少なくとも12ページまで)。そして、あなたはできません プレーンSQLで動的DDLステートメントを実行します。
「PL/pgSQLを回避する」という要求は、別のPLを使用しない限り不可能です。 DO ステートメントは、デフォルトの手続き言語としてplpgsqlを使用します。構文では、明示的な宣言を省略できます:
DO [LANGUAGElang_name]コードコード>
...
lang_name
コードが記述されている手続き型言語の名前。省略された場合、デフォルトはplpgsqlです。 。