Förenkla på ett liknande sätt som du tänkt dig:
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$;
(Bygger på @a_horse_with_no_names svar och förbättras med @Gregorys kommentar.)
Till skillnad från till exempel med CREATE TABLE
det finns ingen IF NOT EXISTS
sats för CREATE ROLE
(upp till minst sid 12). Och du kan inte exekvera dynamiska DDL-satser i vanlig SQL.
Din begäran att "undvika PL/pgSQL" är omöjlig förutom genom att använda en annan PL. DO
uttalandet använder plpgsql som standardspråk för procedur. Syntaxen tillåter att den explicita deklarationen utelämnas:
DO [ LANGUAGE
lang_name
] code
...lang_name
Namnet på det procedurspråk som koden är skriven på. Om det utelämnas är standardinställningenplpgsql
.