PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Filtrer les noms de colonne de la table existante pour l'instruction SQL DDL

Créez la commande DDL de manière dynamique. Vous pouvez le faire en deux étapes :

  1. Instruction de génération :

    SELECT 'CREATE TABLE why.am_i_doing_this AS SELECT '
        || string_agg(column_name, ', ' ORDER BY ordinal_position)
        || ' FROM original.table'
    FROM   information_schema.columns
    WHERE  table_schema = 'original'
    AND    table_name = 'table'
    AND    column_name NOT IN ('column_1', 'column_2');
    
  2. (Vérifiez que c'est bon !) Ensuite, exécutez l'instruction générée lors d'un deuxième aller-retour vers le serveur.

Ceci est basé sur la vue du schéma d'informations information_schema.columns . Vous pouvez également utiliser pg_catalog.pg_attribute . Connexe :

Mais cela peut également être fait en un seul aller-retour vers le serveur :

Avec un DO déclaration de n'importe quel client

DO n'est qu'un simple wrapper pour l'exécution ad-hoc de code PL/pgSQL. Vous pourriez faire la même chose dans une fonction ou une procédure.

DO
$$
BEGIN
   EXECUTE (
   SELECT 'CREATE TABLE why.am_i_doing_this AS SELECT '
       || string_agg(column_name, ', ' ORDER BY ordinal_position)
       || ' FROM original.table'
   FROM   information_schema.columns
   WHERE  table_schema = 'original'
   AND    table_name = 'table'
   AND    column_name NOT IN ('column_1', 'column_2')
   );
END
$$;

Plus simple avec la méta-commande psql \gexec

Puisque vous avez mentionné le terminal interactif par défaut psql . Là, vous pouvez utiliser \gexec . Il ...

Donc :

SELECT 'CREATE TABLE why.am_i_doing_this AS SELECT '
    || string_agg(column_name, ', ' ORDER BY ordinal_position)
    || ' FROM original.table'
FROM   information_schema.columns
WHERE  table_schema = 'original'
AND    table_name = 'table'
AND    column_name NOT IN ('column_1', 'column_2')\gexec