यह सही JSON इस अर्थ में है कि यह मान्य है, लेकिन यह स्पष्ट रूप से वह नहीं है जो आप चाहते हैं। तो उत्तर "सही" की परिभाषा पर निर्भर करता है। हम मान लेंगे कि आप जो चाहते हैं वह "सही" है।
आप इसे u
. एकत्र करने के लिए कह रहे हैं , जो कॉलम team
. के साथ एक परिणाम सेट है . इसका मतलब है कि उसे इस जानकारी को परिणाम में जोड़ना होगा। आपको केवल u.team
. के एकत्रीकरण के लिए कहना चाहिए , वह क्षेत्र जो आप चाहते हैं। तब आपको मनचाहा परिणाम मिलेगा।
WITH matches as
(
select 5 as id, '{"Id":1,"Teams":[{"Name":"TeamA","Players":[{"Name":"AAA"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"CCC"},{"Name":"DDD"}]}],"TeamRank":[1,2]}'::json as match
union all
select 6 as id, '{"Id":2,"Teams":[{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}],"TeamRank":[1,2]}' as match
)
SELECT json_agg(u.team) FROM (
SELECT DISTINCT ON (t.team->>'Name') t.team
FROM matches m, json_array_elements(m.match->'Teams') t(team)
ORDER BY t.team->>'Name', m.id DESC) AS u;
परिणाम: