Bygg DDL-kommandot dynamiskt. Du kan göra det i två steg:
-
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');
-
(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