Byg DDL-kommandoen dynamisk. Du kan gøre det i to trin:
-
Byg erklæring:
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');
-
(Tjek, at den er god!) Udfør derefter den genererede sætning i en anden rundrejse til serveren.
Dette er baseret på informationsskemavisningen information_schema.columns
. Alternativt kan du bruge pg_catalog.pg_attribute
. Relateret:
Men det kan også gøres på en enkelt rundrejse til serveren:
Med en DO
erklæring fra enhver kunde
DO
er blot en simpel indpakning til ad hoc-udførelse af PL/pgSQL-kode. Du kan gøre det samme i en funktion eller 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
$$;
Enklere med psql-metakommando \gexec
Siden du nævnte interaktive standardterminal psql
. Der kan du bruge \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