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

अद्यतन jsonb_set() के साथ नेस्टेड सरणी में केवल एक वस्तु को प्रभावित करता है

स्पष्टीकरण

FROM . में उप-चयन करें आपके UPDATE का खंड रिटर्न तीन पंक्तियाँ। लेकिन लक्ष्य तालिका में प्रत्येक पंक्ति को केवल एक बार अपडेट किया जा सकता है एक ही UPDATE . में आज्ञा। इसका परिणाम यह होता है कि आपको केवल एक . का प्रभाव दिखाई देता है उन तीन पंक्तियों में से।

या, मैनुअल<के शब्दों में /ए> :

इसके अलावा:अपनी सबक्वायरी "सीटीई" को कॉल न करें। यह कॉमन टेबल एक्सप्रेशन नहीं है ।

उचित UPDATE

UPDATE table_ t
SET    value_ = jsonb_set(value_, '{iProps}', sub2.new_prop, false)
FROM  (
   SELECT id
        , jsonb_agg(jsonb_set(prop, '{value, rules}', new_rules, false)
                    ORDER BY idx1) AS new_prop
   FROM  (
      SELECT t.id, arr1.prop, arr1.idx1
           , jsonb_agg(jsonb_set(rule, '{ao,sc}', rule #> '{ao,sc,name}', false)
                       ORDER BY idx2) AS new_rules
      FROM table_ t
         , jsonb_array_elements(value_->'iProps')       WITH ORDINALITY arr1(prop,idx1)
         , jsonb_array_elements(prop->'value'->'rules') WITH ORDINALITY arr2(rule,idx2)
      GROUP  BY t.id, arr1.prop, arr1.idx1
      ) sub1
   GROUP  BY id
   ) sub2
WHERE t.id = sub2.id;

db<>fiddle यहां

jsonb_set() का इस्तेमाल करें प्रत्येक वस्तु (सरणी तत्व) पर उन्हें वापस एक सरणी में एकत्रित करने से पहले। पहले पत्ती के स्तर पर, और फिर गहरे स्तर पर।

मैंने id जोड़ा PRIMARY KEY . के रूप में मेज पर। पंक्तियों को अलग रखने के लिए हमें कुछ अद्वितीय कॉलम चाहिए।

जोड़ा गया ORDER BY आवश्यकता हो भी सकती है और नहीं भी। मूल आदेश की गारंटी के लिए इसे जोड़ा गया।

बेशक, यदि आपका डेटा नमूना के रूप में नियमित है, तो समर्पित कॉलम के साथ एक रिलेशनल डिज़ाइन एक आसान विकल्प हो सकता है। देखें




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL में हर शब्द के पहले अक्षर को कैपिटलाइज़ कैसे करें

  2. PostgreSQL में हिस्टोग्राम कैसे बनाएं

  3. भौगोलिक रूप से बिखरे हुए सर्वर, पोस्टग्रेएसक्यूएल, और जेपीए

  4. पोस्टग्रेज की तुलना में सोलर इतना तेज क्यों है?

  5. Postgresql में कॉलम से हटाए गए मेरे डेटाबेस सीरियल को पुनर्स्थापित करने के बाद