Compile el comando DDL dinámicamente. Puedes hacerlo en dos pasos:
-
Declaración de compilación:
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');
-
(¡Compruebe que está bien!) Luego ejecute la declaración generada en un segundo viaje de ida y vuelta al servidor.
Esto se basa en la vista de esquema de información information_schema.columns
. Alternativamente, podría usar pg_catalog.pg_attribute
. Relacionado:
Pero también se puede hacer en un solo viaje de ida y vuelta al servidor:
Con un DO
declaración de cualquier cliente
DO
es solo un contenedor simple para la ejecución ad-hoc de código PL/pgSQL. Puede hacer lo mismo en una función o procedimiento.
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
$$;
Más simple con el meta-comando psql \gexec
Ya que mencionó el terminal interactiva predeterminada psql
. Allí puede usar \gexec
. Es...
Entonces:
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