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

Filtrer kolonnenavne fra eksisterende tabel til SQL DDL-sætning

Byg DDL-kommandoen dynamisk. Du kan gøre det i to trin:

  1. Byg erklæring:

    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. (Tjek, at den er god!) Udfør derefter den genererede sætning i en anden rundrejse til serveren.

Dette er baseret på informationsskemavisningen information_schema.columns . Alternativt kan du bruge pg_catalog.pg_attribute . Relateret:

Men det kan også gøres på en enkelt rundrejse til serveren:

Med en DO erklæring fra enhver kunde

DO er blot en simpel indpakning til ad hoc-udførelse af PL/pgSQL-kode. Du kan gøre det samme i en funktion eller 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
$$;

Enklere med psql-metakommando \gexec

Siden du nævnte interaktive standardterminal psql . Der kan du bruge \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. java.lang.ArrayIndexOutOfBoundsException:for jdbc-forbindelse

  2. Oracle APEX:pop op-menu

  3. Oracle 12c Apex 4.2 ORA-24247 netværksadgang nægtet af adgangskontrolliste (ACL)

  4. MariaDB JSON_MERGE_PRESERVE() Forklaret