Postgres (और अन्य RDBMS) में पिवट टेबल के साथ मुख्य समस्या यह है कि एक क्वेरी परिणाम की संरचना (संख्या और कॉलम के नाम) चयनित डेटा के आधार पर भिन्न नहीं हो सकती है। संभावित समाधानों में से एक गतिशील रूप से एक दृश्य बनाना है, जो संरचना डेटा द्वारा परिभाषित की जाती है। उदाहरण फ़ंक्शन तालिका के आधार पर एक दृश्य बनाता है 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 $$;
तालिका संशोधित होने के बाद फ़ंक्शन का उपयोग करें (शायद एक ट्रिगर में) और बनाए गए दृश्य को क्वेरी करें:
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)
इसे db<>fiddle.
. में टेस्ट करेंध्यान दें, तालिका में एक नया नाम जोड़े जाने के बाद (या इसमें से कुछ नाम हटा दिया जाता है) केवल एक दृश्य (फ़ंक्शन को कॉल करें) को फिर से बनाना आवश्यक है। यदि अलग-अलग नामों का सेट नहीं बदलता है, तो आप दृश्य को फिर से बनाए बिना क्वेरी कर सकते हैं। यदि सेट को बार-बार संशोधित किया जाता है तो अस्थायी दृश्य बनाना एक बेहतर विकल्प होगा।
आपकी रुचि किसी JSONB फ़ील्ड से फ़्लैटन एग्रीगेटेड की/वैल्यू पेयर में भी हो सकती है?