Bangun perintah DDL secara dinamis. Anda dapat melakukannya dalam dua langkah:
-
Membuat pernyataan:
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');
-
(Periksa apakah sudah baik!) Kemudian jalankan pernyataan yang dihasilkan dalam perjalanan putaran kedua ke server.
Ini didasarkan pada tampilan skema informasi information_schema.columns
. Atau, Anda dapat menggunakan pg_catalog.pg_attribute
. Terkait:
Tapi itu bisa dilakukan dalam satu perjalanan pulang pergi ke server juga:
Dengan DO
pernyataan dari klien mana pun
DO
hanyalah pembungkus sederhana untuk eksekusi ad-hoc kode PL/pgSQL. Anda mungkin melakukan hal yang sama dalam suatu fungsi atau prosedur.
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
$$;
Lebih sederhana dengan psql meta-command \gexec
Karena Anda menyebutkan terminal interaktif default psql
. Di sana Anda dapat menggunakan \gexec
. Itu ...
Jadi:
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