sql >> Database >  >> RDS >> PostgreSQL

Kolomnamen filteren uit bestaande tabel voor SQL DDL-instructie

Bouw de DDL-opdracht dynamisch op. Je kunt het in twee stappen doen:

  1. Bouwverklaring:

    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. (Controleer of het goed is!) Voer vervolgens de gegenereerde instructie uit in een tweede retour naar de server.

Dit is gebaseerd op de informatieschemaweergave information_schema.columns . Als alternatief kunt u pg_catalog.pg_attribute gebruiken . Gerelateerd:

Maar het kan ook in één keer heen en terug naar de server:

Met een DO verklaring van een klant

DO is slechts een simpele wrapper voor ad-hoc uitvoering van PL/pgSQL-code. U kunt hetzelfde doen in een functie of procedure.

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
$$;

Eenvoudiger met psql-meta-commando \gexec

Aangezien je de standaard interactieve terminal psql noemde . Daar kun je \gexec . gebruiken . Het ...

Dus:

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



  1. Wat is CHAR_LENGTH() in MySQL?

  2. Migreren van Oracle naar MySQL

  3. Invoegen in database werkt niet vanwege relaties in database

  4. Hoe om te gaan met MySQL-tijdzone in script