Crea il comando DDL in modo dinamico. Puoi farlo in due passaggi:
-
Build istruzione:
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');
-
(Controlla che sia a posto!) Quindi esegui l'istruzione generata in un secondo round trip al server.
Questo si basa sulla visualizzazione dello schema di informazioni information_schema.columns
. In alternativa, puoi utilizzare pg_catalog.pg_attribute
. Correlati:
Ma può essere fatto anche in un unico viaggio di andata e ritorno al server:
Con un DO
dichiarazione di qualsiasi cliente
DO
è solo un semplice wrapper per l'esecuzione ad hoc di codice PL/pgSQL. Potresti fare lo stesso in una funzione o procedura.
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
$$;
Più semplice con il meta-comando psql \gexec
Dato che hai menzionato il terminale interattivo predefinito psql
. Lì puoi usare \gexec
. È...
Quindi:
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