Създайте DDL командата динамично. Можете да го направите в две стъпки:
-
Изявление за изграждане:
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');
-
(Проверете дали е добре!) След това изпълнете генерирания оператор във второ двупосочно пътуване до сървъра.
Това се основава на изгледа на информационната схема information_schema.columns
. Като алтернатива можете да използвате pg_catalog.pg_attribute
. Свързани:
Но може да се направи и с едно пътуване до сървъра:
С DO
изявление от всеки клиент
DO
е просто обвивка за ad-hoc изпълнение на PL/pgSQL код. Можете да направите същото във функция или процедура.
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
$$;
По-лесно с psql мета-команда \gexec
Тъй като споменахте интерактивния терминал по подразбиране psql
. Там можете да използвате \gexec
. Това...
И така:
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