मेरा मानना है कि LATERAL JOIN
वहाँ चाल चल रहा है। अपनी मूल क्वेरी में, आप json_agg
. का उपयोग कर रहे हैं संपूर्ण तालिका डेटासेट के विरुद्ध ('{"kind":"person"}'
. द्वारा फ़िल्टर किया गया )
with a as
(
select jsonb_array_elements(s.payload) j
from segments s
)
SELECT json_agg(a.j) AS filtered_payload
from a
where j @> '{"kind":"person"}';
इस बीच दूसरे उदाहरण में, आप LATERAL
. का उपयोग करके एक समय में एक पंक्ति के साथ खेल रहे हैं . यही कारण है कि आपके पास एकल "kind":"person"
. के साथ 3 पंक्तियाँ हैं 3 मानों वाली एक अद्वितीय पंक्ति के बजाय मान।
आप जो हासिल करने की कोशिश कर रहे हैं, उसके बारे में निश्चित नहीं है, लेकिन निम्नलिखित आपको सही दिशा में ले जा सकते हैं
SELECT a.filtered_payload,
a.ct_elem_row,
sum(ct_elem_row) OVER () AS ct_elem_total,
count(*) OVER () AS ct_rows
FROM segments s
JOIN LATERAL (
SELECT json_agg(j.elem) AS filtered_payload,
count(*) AS ct_elem_row
FROM segments d, lateral jsonb_array_elements(d.payload) j(elem)
WHERE j.elem @> '{"kind":"person"}'
) a ON ct_elem_row > 0
WHERE s.payload @> '[{"kind":"person"}]';
परिणाम
filtered_payload | ct_elem_row | ct_elem_total | ct_rows
--------------------------------------------------------------------------------------------------------+-------------+---------------+---------
[{"kind": "person", "limit": "1"}, {"kind": "person", "limit": "3"}, {"kind": "person", "limit": "2"}] | 3 | 9 | 3
[{"kind": "person", "limit": "1"}, {"kind": "person", "limit": "3"}, {"kind": "person", "limit": "2"}] | 3 | 9 | 3
[{"kind": "person", "limit": "1"}, {"kind": "person", "limit": "3"}, {"kind": "person", "limit": "2"}] | 3 | 9 | 3
(3 rows)