sql >> Databáze >  >> RDS >> PostgreSQL

Filtrujte názvy sloupců z existující tabulky pro příkaz SQL DDL

Dynamicky vytvořte příkaz DDL. Můžete to udělat ve dvou krocích:

  1. Prohlášení o sestavení:

    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. (Zkontrolujte, zda je to dobré!) Poté proveďte vygenerovaný příkaz v druhé zpáteční cestě na server.

Toto je založeno na zobrazení informačního schématu information_schema.columns . Případně můžete použít pg_catalog.pg_attribute . Související:

Ale lze to udělat také během jedné zpáteční cesty na server:

Pomocí DO výpis z jakéhokoli klienta

DO je jen jednoduchý obal pro ad-hoc spouštění kódu PL/pgSQL. Totéž můžete provést ve funkci nebo proceduře.

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

Jednodušší s meta-příkazem psql \gexec

Protože jste zmínil výchozí interaktivní terminál psql . Zde můžete použít \gexec . To ...

Takže:

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. Mysql řazení Hierarchická data

  2. Zrychlení dotazů GROUP BY, SUM a AVG

  3. Jak vypočítat denní aktivní uživatele (DAU) v MySQL

  4. Převod existující databáze MyISAM na InnoDB pomocí Django