Dovrai usare PL/PgSQL EXECUTE
istruzione, tramite un DO
blocco o funzione PL/PgSQL (CREATE OR REPLACE FUNCTION ... LANGUAGE plpgsql
). L'SQL dinamico non è supportato nel dialetto SQL ordinario utilizzato da PostgreSQL, solo nella variante procedurale PL/PgSQL.
DO
$$
BEGIN
EXECUTE format('CREATE TABLE %I AS SELECT * FROM backup', 'backup_' || to_char(CURRENT_DATE,'yyyy-mm-dd'));
END;
$$ LANGUAGE plpgsql;
Il format(...)
%I
della funzione e %L
gli specificatori di formato eseguono rispettivamente l'identificatore corretto e la virgoletta letterale.
Per i letterali consiglio di usare EXECUTE ... USING
invece di format(...)
con %L
, ma per identificatori come nomi di tabelle/colonne il formato %I
pattern è una bella alternativa concisa al dettagliato quote_ident
chiamate.