Dynamicky vytvořte příkaz DDL. Můžete to udělat ve dvou krocích:
-
Prohlášení o sestavení:
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');
-
(Zkontrolujte, zda je to dobré!) Poté proveďte vygenerovaný příkaz v druhé zpáteční cestě na server.
Toto je založeno na zobrazení informačního schématu information_schema.columns
. Případně můžete použít pg_catalog.pg_attribute
. Související:
Ale lze to udělat také během jedné zpáteční cesty na server:
Pomocí DO
výpis z jakéhokoli klienta
DO
je jen jednoduchý obal pro ad-hoc spouštění kódu PL/pgSQL. Totéž můžete provést ve funkci nebo proceduře.
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
$$;
Jednodušší s meta-příkazem psql \gexec
Protože jste zmínil výchozí interaktivní terminál psql
. Zde můžete použít \gexec
. To ...
Takže:
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