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 [ LANGUAGElang_name] code
...lang_name
O nome da linguagem procedural em que o código está escrito. Se for omitido, o padrão éplpgsql.