Cố gắng sử dụng các cấu trúc động như sau thường cho biết bạn nên sử dụng định dạng dữ liệu như hstore
, json
, xml
, v.v ... có thể truy cập động.
Bạn có thể nhận danh sách cột động bằng cách tạo SQL ngay lập tức trong ứng dụng của bạn. Bạn có thể truy vấn INFORMATION_SCHEMA
để nhận thông tin về các cột của bảng và tạo truy vấn.Có thể thực hiện điều này trong PL/PgSQL và chạy truy vấn được tạo với EXECUTE
nhưng bạn sẽ thấy khó có thể làm việc với kết quả RECORD
, vì bạn phải nhận và giải mã các tuple tổng hợp, bạn không thể mở rộng kết quả được đặt thành danh sách cột bình thường. Quan sát:
craig=> CREATE OR REPLACE FUNCTION retrecset() returns setof record as $$
values (1,2,3,4), (10,11,12,13);
$$ language sql;
craig=> select retrecset();
retrecset
---------------
(1,2,3,4)
(10,11,12,13)
(2 rows)
craig=> select * from retrecset();
ERROR: a column definition list is required for functions returning "record"
craig=> select (r).* FROM (select retrecset()) AS x(r);
ERROR: record type has not been registered
Tất cả những gì bạn có thể làm là lấy bản ghi thô và giải mã nó trong ứng dụng khách. Bạn không thể chỉ mục vào nó từ SQL, bạn không thể chuyển đổi nó thành bất kỳ thứ gì khác, v.v. Hầu hết các API của khách hàng không cung cấp các cơ sở để phân tích cú pháp biểu diễn văn bản của các bản ghi ẩn danh.
Vì vậy: bạn có thể trả lại các bản ghi động từ PL/PgSQL mà không biết loại kết quả của nó, nó không chỉ đặc biệt hữu ích và nó là một nỗi đau để đối phó với phía khách hàng. Bạn thực sự muốn chỉ sử dụng ứng dụng khách để tạo truy vấn ngay từ đầu.
Nguồn
2013-04-04 00:30:21
Bạn đang cố gắng trả lại các cột có chứa năm 2010 trong đó hay bạn đang cố trả về các hàng có cột cụ thể có giá trị 2010 được bao gồm? Bạn không thể chọn danh sách các cột như thế này (tốt, có lẽ với sql động bạn có thể) ... – sgeddes
Bạn có cột có tên là cột không? –
Vâng, tôi đang cố gắng trả lại các cột với năm 2010 như là một phần của tên của họ. Ví dụ có các cột có tên: m01y2010 - vì vậy tôi muốn điều đó, cũng như: m02y2010 ... v.v. - và các giá trị được lưu trữ trong các cột đó. Vì vậy, không có cách nào để lựa chọn một danh sách các cột với năm 2010 trong tên của họ !? –