Simplifique de maneira semelhante ao que você tinha em mente:
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$;
(Com base na resposta de @a_horse_with_no_name e melhorado com o comentário de @Gregory.)
Ao contrário, por exemplo, com
CREATE TABLE
não existe IF NOT EXISTS
cláusula para CREATE ROLE
(até pelo menos a página 12). E você não pode execute instruções DDL dinâmicas em SQL simples. Sua solicitação para "evitar PL/pgSQL" é impossível, exceto usando outro PL. O
DO
A instrução usa plpgsql como linguagem procedural padrão. A sintaxe permite omitir a declaração explícita:
DO [ LANGUAGE
lang_name
] code
...lang_name
O nome da linguagem procedural em que o código está escrito. Se for omitido, o padrão éplpgsql
.