Dynamicznie kompiluj polecenie DDL. Możesz to zrobić w dwóch krokach:
-
Oświadczenie o kompilacji:
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');
-
(Sprawdź, czy jest dobrze!) Następnie wykonaj wygenerowaną instrukcję podczas drugiej podróży w obie strony do serwera.
Jest to oparte na widoku schematu informacyjnego information_schema.columns
. Alternatywnie możesz użyć pg_catalog.pg_attribute
. Powiązane:
Ale można to również zrobić podczas jednej podróży w obie strony na serwer:
Z DO
oświadczenie od dowolnego klienta
DO
jest po prostu prostym opakowaniem do wykonywania ad-hoc kodu PL/pgSQL. Możesz zrobić to samo w funkcji lub procedurze.
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
$$;
Prostsze z metakomendą psql \gexec
Ponieważ wspomniałeś o domyślnym terminalu interaktywnym psql
. Tam możesz użyć \gexec
. To ...
A więc:
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