sql >> Databasteknik >  >> RDS >> PostgreSQL

Filtrera kolumnnamn från befintlig tabell för SQL DDL-sats

Bygg DDL-kommandot dynamiskt. Du kan göra det i två steg:

  1. Bygg uttalande:

    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. (Kontrollera att det är bra!) Kör sedan den genererade satsen i en andra rundresa till servern.

Detta är baserat på informationsschemavyn information_schema.columns . Alternativt kan du använda pg_catalog.pg_attribute . Relaterat:

Men det kan också göras på en enda tur och retur till servern:

Med en DO uttalande från vilken kund som helst

DO är bara ett enkelt omslag för ad-hoc exekvering av PL/pgSQL-kod. Du kanske gör samma sak i en funktion eller procedur.

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

Enklare med psql-metakommandot \gexec

Eftersom du nämnde interaktiva standardterminalen psql . Där kan du använda \gexec . Det ...

Så:

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. Hur använder jag vårdata jpa för att fråga i jsonb-kolumnen?

  2. Gå igenom en lista med tabellkolumner och tillämpa en fråga på dem

  3. Finns det någon prestandavinst i att indexera ett booleskt fält?

  4. Hur kan jag snabba upp row_number i Oracle?