PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Spaltennamen aus vorhandener Tabelle für SQL-DDL-Anweisung filtern

Erstellen Sie den DDL-Befehl dynamisch. Sie können dies in zwei Schritten tun:

  1. Build-Anweisung:

    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. (Überprüfen Sie, ob es gut ist!) Führen Sie dann die generierte Anweisung in einem zweiten Roundtrip zum Server aus.

Dies basiert auf der Informationsschemaansicht information_schema.columns . Alternativ können Sie pg_catalog.pg_attribute verwenden . Verwandte:

Aber es kann auch in einem einzigen Roundtrip zum Server erledigt werden:

Mit einem DO Aussage von jedem Kunden

DO ist nur ein einfacher Wrapper für die Ad-hoc-Ausführung von PL/pgSQL-Code. Sie können dasselbe in einer Funktion oder Prozedur tun.

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

Einfacher mit psql-Meta-Befehl \gexec

Da Sie das standardmäßige interaktive Terminal psql erwähnt haben . Dort können Sie \gexec verwenden . Es ...

Also:

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