Sie müssen PL/PgSQL EXECUTE
verwenden -Anweisung über ein DO
Block oder PL/PgSQL-Funktion (CREATE OR REPLACE FUNCTION ... LANGUAGE plpgsql
). Dynamisches SQL wird im gewöhnlichen SQL-Dialekt, der von PostgreSQL verwendet wird, nicht unterstützt, nur in der prozeduralen PL/PgSQL-Variante.
DO
$$
BEGIN
EXECUTE format('CREATE TABLE %I AS SELECT * FROM backup', 'backup_' || to_char(CURRENT_DATE,'yyyy-mm-dd'));
END;
$$ LANGUAGE plpgsql;
Das format(...)
%I
der Funktion und %L
format-spezifizierer führen entsprechende Bezeichner bzw. wörtliche Anführungszeichen aus.
Für Literale empfehle ich die Verwendung von EXECUTE ... USING
statt format(...)
mit %L
, aber für Bezeichner wie Tabellen-/Spaltennamen das Format %I
Muster ist eine schöne prägnante Alternative zum ausführlichen quote_ident
Anrufe.