Vấn đề chính với bảng tổng hợp trong Postgres (và các RDBMS khác) là cấu trúc (số lượng và tên các cột) của kết quả truy vấn không thể thay đổi tùy thuộc vào dữ liệu đã chọn. Một trong những giải pháp khả thi là tạo chế độ xem động, cấu trúc được xác định bởi dữ liệu. Hàm ví dụ tạo một dạng xem dựa trên bảng example_table
:
create or replace function create_pivot_view()
returns void language plpgsql as $$
declare
list text;
begin
select string_agg(format('jdata->>%1$L "%1$s"', name), ', ')
from (
select distinct name
from example_table
) sub
into list;
execute format($f$
drop view if exists example_pivot_view;
create view example_pivot_view as
select lbl, %s
from (
select lbl, json_object_agg(name, value) jdata
from example_table
group by 1
order by 1
) sub
$f$, list);
end $$;
Sử dụng hàm sau khi bảng được sửa đổi (có thể trong trình kích hoạt) và truy vấn chế độ xem đã tạo:
select create_pivot_view();
select *
from example_pivot_view;
lbl | num | colour | percentage
-----+-----+--------+------------
1 | 1 | Red | 25.0
2 | 2 | Green | 50.0
3 | 3 | Blue | 75.0
(3 rows)
Kiểm tra nó trong db <> fiddle.
Lưu ý rằng cần tạo lại một dạng xem (gọi hàm) chỉ sau khi một tên mới được thêm vào bảng (hoặc một số tên bị xóa khỏi nó). Nếu tập hợp các tên riêng biệt không thay đổi, bạn có thể truy vấn chế độ xem mà không cần tạo lại. Nếu tập hợp được sửa đổi thường xuyên thì việc tạo một chế độ xem tạm thời sẽ là một lựa chọn tốt hơn.
Bạn cũng có thể quan tâm đến Làm phẳng các cặp khóa / giá trị tổng hợp từ trường JSONB?