Bouw de DDL-opdracht dynamisch op. Je kunt het in twee stappen doen:
-
Bouwverklaring:
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');
-
(Controleer of het goed is!) Voer vervolgens de gegenereerde instructie uit in een tweede retour naar de server.
Dit is gebaseerd op de informatieschemaweergave information_schema.columns
. Als alternatief kunt u pg_catalog.pg_attribute
gebruiken
. Gerelateerd:
Maar het kan ook in één keer heen en terug naar de server:
Met een DO
verklaring van een klant
DO
is slechts een simpele wrapper voor ad-hoc uitvoering van PL/pgSQL-code. U kunt hetzelfde doen in een functie of 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
$$;
Eenvoudiger met psql-meta-commando \gexec
Aangezien je de standaard interactieve terminal psql
noemde
. Daar kun je \gexec
. gebruiken . Het ...
Dus:
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