मानना डेटा प्रकार jsonb
और आप प्रत्येक JSON सरणी के रिकॉर्ड को मर्ज करना चाहते हैं जो समान 'id' मान साझा करते हैं।
पोस्टग्रेस 9.5
नए concatenate के साथ इसे आसान बनाता है ऑपरेटर ||
jsonb
. के लिए मान
:
SELECT json_agg(elem1 || elem2) AS result
FROM (
SELECT elem1->>'id' AS id, elem1
FROM (
SELECT '[
{"id":1, "percent":12.50},
{"id":2, "percent":75.00},
{"id":3, "percent":12.50}
]'::jsonb AS js
) t, jsonb_array_elements(t.js) elem1
) t1
FULL JOIN (
SELECT elem2->>'id' AS id, elem2
FROM (
SELECT '[
{"id": 1, "a": "text1a", "b": "text1b", "percent":12.50},
{"id": 2, "a": "text2a", "b": "text2b", "percent":75.00},
{"id": 3, "a": "text3a", "b": "text3b", "percent":12.50}]'::jsonb AS js
) t, jsonb_array_elements(t.js) elem2
) t2 USING (id);
FULL [OUTER] JOIN
सुनिश्चित करता है कि आप अन्य सरणी में मिलान के बिना रिकॉर्ड न खोएं।
प्रकार jsonb
रिकॉर्ड में प्रत्येक कुंजी के लिए केवल नवीनतम मान रखने के लिए सुविधाजनक संपत्ति है। इसलिए, परिणाम में डुप्लिकेट 'आईडी' कुंजी अपने आप मर्ज हो जाती है।
Postgres 9.5 मैनुअल भी सलाह देता है:
9.4 पोस्ट करें
थोड़ा कम सुविधाजनक है। मेरा विचार सरणी तत्वों को निकालने के लिए होगा, फिर सभी कुंजी/मान जोड़े निकालें, UNION
दोनों परिणाम, एक नए jsonb
. में एकत्रित होते हैं मान प्रति आईडी मान और अंत में एक ही सरणी में एकत्रित होते हैं।
SELECT json_agg(j) -- ::jsonb
FROM (
SELECT json_object_agg(key, value)::jsonb AS j
FROM (
SELECT elem->>'id' AS id, x.*
FROM (
SELECT '[
{"id":1, "percent":12.50},
{"id":2, "percent":75.00},
{"id":3, "percent":12.50}]'::jsonb AS js
) t, jsonb_array_elements(t.js) elem, jsonb_each(elem) x
UNION ALL -- or UNION, see below
SELECT elem->>'id' AS id, x.*
FROM (
SELECT '[
{"id": 1, "a": "text1a", "b": "text1b", "percent":12.50},
{"id": 2, "a": "text2a", "b": "text2b", "percent":75.00},
{"id": 3, "a": "text3a", "b": "text3b", "percent":12.50}]'::jsonb AS js
) t, jsonb_array_elements(t.js) elem, jsonb_each(elem) x
) t
GROUP BY id
) t;
jsonb
. पर कास्ट करें डुप्लिकेट कुंजियों को हटा देता है। वैकल्पिक रूप से आप UNION
. का उपयोग कर सकते हैं डुप्लिकेट को फोल्ड करने के लिए (उदाहरण के लिए यदि आप json
. चाहते हैं परिणाम के रूप में)। परीक्षण जो आपके मामले के लिए तेज़ है।
संबंधित: