Você precisará usar o PL/PgSQL
EXECUTE
instrução, por meio de um DO
bloco ou função PL/PgSQL (CREATE OR REPLACE FUNCTION ... LANGUAGE plpgsql
). SQL dinâmico não é suportado no dialeto SQL comum usado pelo PostgreSQL, apenas na variante procedural PL/PgSQL. DO
$$
BEGIN
EXECUTE format('CREATE TABLE %I AS SELECT * FROM backup', 'backup_' || to_char(CURRENT_DATE,'yyyy-mm-dd'));
END;
$$ LANGUAGE plpgsql;
O
format(...)
função %I
e %L
os especificadores de formato fazem o identificador adequado e as aspas literais, respectivamente. Para literais, recomendo usar
EXECUTE ... USING
em vez de format(...)
com %L
, mas para identificadores como nomes de tabela/coluna o formato %I
pattern é uma boa alternativa concisa ao verbose quote_ident
chamadas.