PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

मैं दो JSON सरणियों के अंदर रिकॉर्ड कैसे मर्ज कर सकता हूं?

मानना डेटा प्रकार 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 . चाहते हैं परिणाम के रूप में)। परीक्षण जो आपके मामले के लिए तेज़ है।

संबंधित:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. तालिका से पिछले तीन महीने के रिकॉर्ड प्राप्त करें

  2. PostgreSQL में किसी फ़ंक्शन के अंदर किसी चयन का परिणाम कैसे वापस करें?

  3. sqlalchemy सममित कई से एक दोस्ती

  4. पोस्टग्रेज में एक जेसन सरणी को पंक्तियों में कैसे बदलें

  5. कॉलम से व्युत्पन्न गतिशील तालिका नाम के साथ बाएं शामिल हों