Создайте команду 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-ho c выполнения кода PL / pg SQL. Вы можете сделать то же самое в функции или процедуре.
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
. Он ...
Отправляет текущий буфер запроса на сервер, а затем обрабатывает каждый столбец каждой строки вывода запроса (если есть) как оператор SQL, который должен быть выполнен.
Итак:
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