Lưu trữ đầu ra của truy vấn đã chọn trong một mảng trong postgres


86

Mã của tôi là:

SELECT column_name
FROM information.SCHEMA.columns
WHERE table_name = 'aean'

Nó trả về tên cột của bảng aean.
Bây giờ tôi đã khai báo một mảng:

DECLARE colnames text[]

Làm cách nào để lưu trữ đầu ra của select trong mảng colnames.
Có cần phải khởi tạo các colnames không?


+1, tôi đã đến đây với thông báo lỗi giống hệt nhau- LỖI: không thể tìm thấy kiểu mảng cho kiểu dữ liệu information_schema.sql_identifier. Đã cố gắng vớiarray_agg(column_name, ',')
jerrymouse

Câu trả lời:


150

Có hai cách. Một là tổng hợp:

SELECT array_agg(column_name::TEXT)
FROM information.schema.columns
WHERE table_name = 'aean'

Cách khác là sử dụng một hàm tạo mảng:

SELECT ARRAY(
SELECT column_name 
FROM information.schema.columns 
WHERE table_name = 'aean')

Tôi cho rằng điều này là dành cho plpgsql. Trong trường hợp đó, bạn có thể gán nó như thế này:

colnames := ARRAY(
SELECT column_name
FROM information.schema.columns
WHERE table_name='aean'
);

bạn có thể cho tôi mã mà các công trình trên postgres vì đây không phải là làm việc trên postgres LỖI: Không thể tìm thấy kiểu mảng cho kiểu dữ liệu information_schema.sql_identifier
Mitesh

Xin lỗi vì việc đó. Sao chép và dán vô tâm có array_agg () được bao gồm trong cả ba lệnh gọi. Tôi cũng đã nhập phiên bản đầu tiên để làm cho phiên bản PG của bạn hài lòng.
Denis de Bernardy

9
Đối với bất kỳ ai muốn tìm hiểu sâu hơn về phần plpgsql, bạn có thể tạo DECLAREmột mảng như my_array INTEGER[];(hoặc bất kỳ kiểu liên quan nào). Bạn cũng có thể sử dụng mảng trong WHEREmệnh đề của truy vấn như WHERE values = ANY(my_array). Các ANYmất một mảng hoặc một tập và sẽ kiểm tra sự hiện diện trong đó mảng / bộ, vì vậy nó có chức năng tương đương để IN ()theo một nghĩa
user2490003

11

Tôi đã có cùng vấn đề y hệt. Chỉ cần một sửa đổi hoạt động nữa của giải pháp do Denis đưa ra (loại phải được chỉ định):

SELECT ARRAY(
SELECT column_name::text
FROM information_schema.columns
WHERE table_name='aean'
)

1
Điều này dường như không còn là trường hợp nữa.
Soviut
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.