Deberá utilizar PL/PgSQL EXECUTE
declaración, a través de un DO
bloque o función PL/PgSQL (CREATE OR REPLACE FUNCTION ... LANGUAGE plpgsql
). SQL dinámico no es compatible con el dialecto de SQL ordinario que utiliza PostgreSQL, solo en la variante de procedimiento PL/PgSQL.
DO
$$
BEGIN
EXECUTE format('CREATE TABLE %I AS SELECT * FROM backup', 'backup_' || to_char(CURRENT_DATE,'yyyy-mm-dd'));
END;
$$ LANGUAGE plpgsql;
El format(...)
%I
de la función y %L
los especificadores de formato hacen un identificador adecuado y citas literales, respectivamente.
Para literales recomiendo usar EXECUTE ... USING
en lugar de format(...)
con %L
, pero para identificadores como nombres de tablas/columnas el formato %I
el patrón es una buena alternativa concisa al detallado quote_ident
llamadas.