Simplifiez de la même manière que ce que vous aviez en tête :
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$;
(S'appuyant sur la réponse de @a_horse_with_no_name et amélioré avec le commentaire de @Gregory.)
Contrairement, par exemple, à CREATE TABLE il n'y a pas de IF NOT EXISTS clause pour CREATE ROLE (jusqu'à au moins la page 12). Et vous ne pouvez pas exécuter des instructions DDL dynamiques en SQL brut.
Votre demande "d'éviter PL/pgSQL" est impossible sauf en utilisant un autre PL. Le DO L'instruction utilise plpgsql comme langage procédural par défaut. La syntaxe permet d'omettre la déclaration explicite :
DO [ LANGUAGElang_name] codelang_name
Le nom du langage procédural dans lequel le code est écrit. Si omis, la valeur par défaut estplpgsql.