Xây dựng động lệnh DDL. Bạn có thể thực hiện theo hai bước:
-
Tuyên bố xây dựng:
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');
-
(Kiểm tra xem nó tốt!) Sau đó, thực hiện câu lệnh đã tạo trong chuyến đi vòng thứ hai đến máy chủ.
Điều này dựa trên chế độ xem giản đồ thông tin information_schema.columns
. Ngoài ra, bạn có thể sử dụng pg_catalog.pg_attribute
. Có liên quan:
Nhưng nó cũng có thể được thực hiện trong một chuyến đi khứ hồi đến máy chủ:
Với DO
tuyên bố từ bất kỳ khách hàng nào
DO
chỉ là một trình bao bọc đơn giản để thực thi đặc biệt mã PL / pgSQL. Bạn có thể làm tương tự trong một hàm hoặc thủ tục.
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
$$;
Đơn giản hơn với siêu lệnh psql \gexec
Vì bạn đã đề cập đến thiết bị đầu cuối tương tác mặc định psql
. Ở đó, bạn có thể sử dụng \gexec
. Nó ...
Vì vậy:
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