PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Filtrar nomes de coluna da tabela existente para instrução SQL DDL


Crie o comando DDL dinamicamente. Você pode fazer isso em duas etapas:

  1. Declaração de construção:
    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. (Verifique se está bom!) Em seguida, execute a instrução gerada em uma segunda viagem de ida e volta ao servidor.

Isso é baseado na visualização do esquema de informações information_schema.columns . Como alternativa, você pode usar pg_catalog.pg_attribute . Relacionado:

Mas isso também pode ser feito em uma única viagem de ida e volta ao servidor:

Com um DO declaração de qualquer cliente


DO é apenas um wrapper simples para execução ad-hoc de código PL/pgSQL. Você pode fazer o mesmo em uma função ou procedimento.
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
$$;

Mais simples com o meta-comando psql \gexec


Como você mencionou o terminal interativo padrão psql . Lá você pode usar \gexec . Isto ...

Então:
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