Crie o comando DDL dinamicamente. Você pode fazer isso em duas etapas:
-
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');
-
(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