PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Filtra i nomi delle colonne dalla tabella esistente per l'istruzione SQL DDL

Crea il comando DDL in modo dinamico. Puoi farlo in due passaggi:

  1. Build istruzione:

    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. (Controlla che sia a posto!) Quindi esegui l'istruzione generata in un secondo round trip al server.

Questo si basa sulla visualizzazione dello schema di informazioni information_schema.columns . In alternativa, puoi utilizzare pg_catalog.pg_attribute . Correlati:

Ma può essere fatto anche in un unico viaggio di andata e ritorno al server:

Con un DO dichiarazione di qualsiasi cliente

DO è solo un semplice wrapper per l'esecuzione ad hoc di codice PL/pgSQL. Potresti fare lo stesso in una funzione o procedura.

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

Più semplice con il meta-comando psql \gexec

Dato che hai menzionato il terminale interattivo predefinito psql . Lì puoi usare \gexec . È...

Quindi:

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