web-dev-qa-db-fra.com

PostgreSQL - valeur dynamique comme nom de table

Duplicata possible:
Fonction de requête dynamique Postgres

Je souhaite utiliser la chaîne retournée de la requête ci-dessous comme nom de table pour une autre requête.

SELECT 'backup_' || TO_CHAR(CURRENT_DATE,'yyyy-mm-dd')

comme vous pouvez le voir, il renvoie une chaîne. Je souhaite l'utiliser comme entrée pour une autre requête, par ex.

CREATE TABLE (SELECT 'backup_' || TO_CHAR(CURRENT_DATE,'yyyy-mm-dd')) 
AS * SELECT FROM backup

Peut-on le faire? Un indice comment?

23
Mr.

Vous devrez utiliser la commande PL/PgSQL EXECUTE , via un bloc DO ou une fonction PL/PgSQL (CREATE OR REPLACE FUNCTION ... LANGUAGE plpgsql). Dynamic SQL n'est pas pris en charge dans le dialecte SQL ordinaire utilisé par PostgreSQL, uniquement dans la variante procédurale PL/PgSQL.

DO
$$
BEGIN
EXECUTE format('CREATE TABLE %I AS SELECT * FROM backup', 'backup_' || to_char(CURRENT_DATE,'yyyy-mm-dd'));
END;
$$ LANGUAGE plpgsql;

Les spécificateurs de format format(...)%I Et %L Font respectivement l'identificateur et la citation littérale.

Pour les littéraux, je recommande d'utiliser EXECUTE ... USING Plutôt que format(...) avec %L, Mais pour les identificateurs comme les noms de table/colonne, le format %I Est une alternative agréable et concise pour passer des appels quote_ident verbeux.

45
Craig Ringer