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

अन्य फ़ील्ड के मान के आधार पर JSONB कॉलम में नया आइटम डालें - पोस्टग्रेज़

क्वेरी को पूरा करने के लिए यह पर्याप्त जानकारी होनी चाहिए:

आइए नकली डेटा बनाएं

create table a (id serial primary key , b jsonb);

insert into a (b)
values ('[
  {
    "name": "test",
    "features": [
      {
        "name": "feature1",
        "granted": false
      },
      {
        "name": "feature2",
        "granted": true
      }
    ]
  },
  {
    "name": "another-name",
    "features": [
      {
        "name": "feature1",
        "granted": false
      },
      {
        "name": "feature2",
        "granted": true
      }
    ]
  }
]');

अब अनुक्रमणिका और गुण प्राप्त करने के लिए सामान्यता के साथ jsonb_array_elements का उपयोग करके सरणी को विस्फोट करें

select first_level.id, position, feature_position, feature
from (select a.id, arr.*
      from a,
           jsonb_array_elements(a.b) with ordinality arr (elem, position)
      where elem ->> 'name' = 'test') first_level,
     jsonb_array_elements(first_level.elem -> 'features') with ordinality features (feature, feature_position);

इस क्वेरी का परिणाम है:

1,1,1,"{""name"": ""feature1"", ""granted"": false}"
1,1,2,"{""name"": ""feature2"", ""granted"": true}"

वहां आपके पास आवश्यक जानकारी है जो आपको आवश्यक उप तत्वों के साथ-साथ आपकी क्वेरी के लिए आवश्यक सभी अनुक्रमणिका लाने के लिए आवश्यक है।

अब, अंतिम संपादन के लिए, आपके पास पहले से ही वह प्रश्न था जो आप चाहते थे:

UPDATE my_table SET modules =
    jsonb_insert(my_column, '{0, features, 0}', '{"name": "newFeature", "granted": false}')
WHERE my_column ->> 'name' = 'test' AND my_column @> '{"features": [{"name":"feature1", "granted": false}]}';

जहां आप आईडी का उपयोग करेंगे, क्योंकि वे पंक्तियां हैं जिनमें आप रुचि रखते हैं, और इंडेक्स में आप उन्हें क्वेरी से प्राप्त करते हैं। तो:

UPDATE my_table SET modules =
    jsonb_insert(my_column, '{' || exploded_info.position::string || ', features, ' || exploded_info.feature_position || '}', '{"name": "newFeature", "granted": false}') from (/* previous query */) as exploded_info
WHERE exploded_info.id = my_table.id and exploded_info.feature -> 'granted' = false;

जैसा कि आप देख सकते हैं कि यह आसानी से बहुत बुरा हो जाता है।

मैं या तो अधिक sql दृष्टिकोण का उपयोग करने की सलाह दूंगा, अर्थात, एक तालिका में सुविधाओं के बजाय एक json के अंदर, एक fk जो आपकी तालिका से लिंक कर रहा है ... यदि आपको वास्तव में 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. PostgreSQL को लंबवत रूप से स्केल करना

  2. पॉइंट इन टाइम रिकवरी का उपयोग करके अपने पोस्टग्रेएसक्यूएल डेटाबेस के लिए आरपीओ को कम कैसे करें

  3. Psycopg2 छवि नहीं मिली

  4. पोस्टग्रेज़ सभी स्तंभों का चयन करता है लेकिन एक स्तंभ द्वारा समूहित करता है

  5. Postgres . में प्रत्येक पंक्ति का मिलान करने के लिए गिनती का उपयोग करके नेस्टेड चयन करें