Créez la commande DDL de manière dynamique. Vous pouvez le faire en deux étapes :
-
Instruction de génération :
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');
-
(Vérifiez que c'est bon !) Ensuite, exécutez l'instruction générée lors d'un deuxième aller-retour vers le serveur.
Ceci est basé sur la vue du schéma d'informations information_schema.columns
. Vous pouvez également utiliser pg_catalog.pg_attribute
. Connexe :
Mais cela peut également être fait en un seul aller-retour vers le serveur :
Avec un DO
déclaration de n'importe quel client
DO
n'est qu'un simple wrapper pour l'exécution ad-hoc de code PL/pgSQL. Vous pourriez faire la même chose dans une fonction ou une procédure.
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
$$;
Plus simple avec la méta-commande psql \gexec
Puisque vous avez mentionné le terminal interactif par défaut psql
. Là, vous pouvez utiliser \gexec
. Il ...
Donc :
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