Erstellen Sie den DDL-Befehl dynamisch. Sie können dies in zwei Schritten tun:
-
Build-Anweisung:
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');
-
(Überprüfen Sie, ob es gut ist!) Führen Sie dann die generierte Anweisung in einem zweiten Roundtrip zum Server aus.
Dies basiert auf der Informationsschemaansicht information_schema.columns
. Alternativ können Sie pg_catalog.pg_attribute
verwenden
. Verwandte:
Aber es kann auch in einem einzigen Roundtrip zum Server erledigt werden:
Mit einem DO
Aussage von jedem Kunden
DO
ist nur ein einfacher Wrapper für die Ad-hoc-Ausführung von PL/pgSQL-Code. Sie können dasselbe in einer Funktion oder Prozedur tun.
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
$$;
Einfacher mit psql-Meta-Befehl \gexec
Da Sie das standardmäßige interaktive Terminal psql
erwähnt haben
. Dort können Sie \gexec
verwenden . Es ...
Also:
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