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

Postgres में संग्रहीत jsonb डेटा की संरचना को कैसे बदलें

आप इसे कुछ json फंक्शन से हासिल कर सकते हैं। पोस्टग्रेस्क्ल में उपलब्ध है।

नीचे काम कर रहे db-fiddle के उदाहरण में मैंने कुछ अतिरिक्त परीक्षण डेटा शामिल किए हैं।

स्कीमा (PostgreSQL v13)

तालिका बनाएं my_table ("dest" json); my_table ("dest") VALUES में INSERT करें ('{"गंतव्य सूची":[{"नाम":"TV3/TVNZ/CHOICE", "गंतव्य":[183, 165]}]}'), ('{"गंतव्य सूची":[{"नाम":"दूसरा परीक्षण", "गंतव्य":[103, 105]}, {"नाम":"तीसरा परीक्षण", "गंतव्य" ":[3, 5]}]}'); 

क्वेरी #1

विस्तारित_डेटा AS के साथ (चुनें गंतव्य ::पाठ, json_build_object ('नाम', dl->> 'नाम', 'गंतव्य'), json_agg (json_build_object ('Id', dld::text::int) ) ) my_table से dest_list_item के रूप में, json_array_elements(dest->'DestinationLists') dl, json_array_elements(dl->'destations') dld GROUP BY dest::text,dl->>'name') json_build_object('DestinationLists' चुनें, json_agg(dest_list_item) ) के रूप में new_destFROM Extended_dataGROUP BY dest::text; 
new_dest
{"DestinationLists":[{"name":"ThirdTest",,"destinations":[{"Id":3},{"Id":5}]},{"name ":"SecondTest","destinations":[{"Id":103},{"Id":105}]}]}
{"DestinationLists":[{"name":"TV3/TVNZ/CHOICE",,"destinations":[{"Id":183},{"Id":165}]}]}

डीबी फिडल पर देखें

1 संपादित करें

आपके संपादन के जवाब में, नीचे दिए गए कोड को स्टेटमेंट से अपडेट के रूप में इस्तेमाल किया जा सकता है। नायब। सीटीई को एक सबक्वायरी के रूप में भी फिर से लिखा जा सकता है। कृपया नीचे दिया गया उदाहरण देखें:

स्कीमा (PostgreSQL v13)

तालिका बनाएं my_table ( id bigserial, "dest" jsonb); INSERT INTO my_table ("dest") VALUES ('{"DestinationLists":[{"name":"TV3/TVNZ/CHOICE", " गंतव्य":[183, 165]}]}'), ('{"गंतव्य सूची":[{"नाम":"दूसरा परीक्षण", "गंतव्य":[103, 105]}, {"नाम":"तीसरा परीक्षण" , "गंतव्य":[3, 5]}]}'); 
जैसा my_table से dest_list_item, jsonb_array_elements(dest->'DestinationLists') dl, jsonb_array_elements(dl->'destations') dld GROUP BY id, dl->>'name'), new_json AS ( SELECT id, json_build_object ('DestinationLists') json_agg(dest_list_item)) as new_dest FROM Extended_data GROUP BY id)अपडेट my_tableSET dest =new_json.new_destFROM new_jsonWHERE my_table.id =new_json.id;

बाद

चुनें * my_table से; 
आईडी गंतव्य
1 {"DestinationLists":[{"name":"TV3/TVNZ/CHOICE",,"destinations":[{"Id":183},{"Id":165}]}]}
2 {"गंतव्य सूची":[{"नाम":"दूसरा परीक्षण",,"गंतव्य":[{"Id":103},{"Id":105}]},{"name":"ThirdTest", "गंतव्य":[{"Id":3},{"Id":5}]}]}

डीबी फिडल पर देखें

2 संपादित करें

यह संपादन किनारे के मामलों पर प्रतिक्रिया करता है जहां कुछ गंतव्यों में गंतव्य नहीं हो सकते हैं और इस तरह अद्यतन नहीं किया जा सकता है।

परीक्षण करने के लिए, दो अतिरिक्त रिकॉर्ड जोड़े गए, नमूना रिकॉर्ड प्रदान किया गया जहां दो नामित गंतव्य सूचियां हैं लेकिन केवल एक में गंतव्य हैं और दूसरा जहां कोई गंतव्य नहीं है, वहां नामित गंतव्य सूची है।

अद्यतन यह सुनिश्चित करता है कि यदि कोई परिवर्तन नहीं हैं, तो नामित गंतव्य सूचियाँ हैं जिनमें कोई गंतव्य नहीं है कि ये वही रहें। यह यह जाँच कर आश्वस्त करता है कि नामित गंतव्य सूची आइटम की संख्या खाली गंतव्य सूची आइटम की संख्या के समान है या नहीं। चूंकि सभी खाली हैं, यह इस रिकॉर्ड को अद्यतन से फ़िल्टर करता है और डेटाबेस पर आवश्यक अद्यतनों की संख्या को कम करता है। इसका एक उदाहरण रिकॉर्ड संख्या है 4

इन खाली सूचियों को समायोजित करने के लिए प्रारंभिक क्वेरी को संशोधित किया गया था क्योंकि उन्हें पिछले दृष्टिकोण से फ़िल्टर किया जा रहा था।

स्कीमा (PostgreSQL v13)

तालिका बनाएं my_table ( id bigserial, "dest" jsonb); INSERT INTO my_table ("dest") VALUES ('{"DestinationLists":[{"name":"TV3/TVNZ/CHOICE", " गंतव्य":[183, 165]}]}'), ('{"गंतव्य सूची":[{"नाम":"दूसरा परीक्षण", "गंतव्य":[103, 105]}, {"नाम":"तीसरा परीक्षण" , "गंतव्य":[3, 5]}]}'), ('{"गंतव्य सूची":[{"नाम":"TVNZ, Mediaworks, पसंद", "गंतव्य":[]}, {"नाम":"TVNZ, डिस्कवरी", "गंतव्य":[165, 183, 4155]}]}'), ('{"गंतव्य सूची":[{"नाम":"चौथा टेस्ट", "गंतव्य":[]}]} '); 

क्वेरी #1

  '------ से पहले -----' चुनें; 
?column?
---------- पहले -----

क्वेरी #2

चुनें * my_table से; 
आईडी गंतव्य
1 {"DestinationLists":[{"name":"TV3/TVNZ/CHOICE",,"destinations":[183,165]}]}
2 {"DestinationLists":[{"name":"SecondTest",,"destinations":[103,105]},{"name":"ThirdTest",,"destinations":[3,5]}]}
3 {"गंतव्य सूची":[{"नाम":"TVNZ, Mediaworks, पसंद", "गंतव्य":[]}, {"नाम":"TVNZ, डिस्कवरी", "गंतव्य":[165,183,4155] }]}
4 {"गंतव्य सूची":[{"नाम":"चौथा परीक्षण", "गंतव्य":[]}]}

क्वेरी #3

विस्तारित_डेटा AS के साथ ( SELECT id, CASE WHEN COUNT(dld)=0 तब 1 ELSE 0 END as name_has_empty_list_item, json_build_object('name', dl->>'name', 'destinations', CASE WHEN COUNT (dld)=0 तब to_json(array[]::json[]) ELSE json_agg(json_build_object('Id',dld::text::int ) ) END) my_table से dest_list_item के रूप में, jsonb_array_elements(dest->'DestinationLists' ) dl LEFT JOIN jsonb_array_elements(dl->'destinations') dld ON 1=1 ग्रुप बाय आईडी, dl->>'name'), new_json AS ( SELECT id, COUNT(dest_list_item) no_list_item के रूप में, SUM(name_has_empty_list_item) no_list_item के रूप में , json_build_object ('गंतव्य सूची', jso n_agg(dest_list_item)) जैसा कि new_dest FROM Extended_data GROUP by id HAVING SUM(name_has_empty_list_item) <> COUNT(dest_list_item) )चुनें * new_json से; 
आईडी no_list_item no_empty_list_item new_dest
1 1 0 {"DestinationLists":[{"name":"TV3/TVNZ/CHOICE",,"destinations":[{"Id":183},{"Id":165}]}]}
2 2 0 {"गंतव्य सूची":[{"नाम":"दूसरा परीक्षण",,"गंतव्य":[{"Id":103},{"Id":105}]},{"name":"ThirdTest", "गंतव्य":[{"Id":3},{"Id":5}]}]}
3 2 1 {"गंतव्य सूची":[{"name":"TVNZ, Discovery",,"destinations":[{"Id":165},{"Id":183},{"Id":4155}]} ,{"name":"TVNZ, Mediaworks, Choice","destinations":[]}]}

क्वेरी #4

विस्तारित_डेटा AS के साथ ( SELECT id, CASE WHEN COUNT(dld)=0 तब 1 ELSE 0 END as name_has_empty_list_item, json_build_object('name', dl->>'name', 'destinations', CASE WHEN COUNT (dld)=0 तब to_json(array[]::json[]) ELSE json_agg(json_build_object('Id',dld::text::int ) ) END) my_table से dest_list_item के रूप में, jsonb_array_elements(dest->'DestinationLists' ) dl LEFT JOIN jsonb_array_elements(dl->'destations') dld ON 1=1 GROUP BY id,dl->>'name'), new_json AS ( SELECT id, json_build_object('DestinationLists', json_agg(dest_list_item)) new_dest के रूप में FROM Extended_data GROUP BY id HAVING SUM(name_has_empty_list_item) <> COUNT(dest_list_item))अपडेट my_tableSET dest =new_json.new_destFROM new_jsonWHERE my_table.id =new_json.id; 

प्रदर्शित करने के लिए कोई परिणाम नहीं हैं।

क्वेरी #5

चुनें------बाद -----'; 
?column?
---------- के बाद -----

क्वेरी #6

चुनें * my_table से; 
आईडी गंतव्य
4 {"गंतव्य सूची":[{"नाम":"चौथा परीक्षण", "गंतव्य":[]}]}
1 {"DestinationLists":[{"name":"TV3/TVNZ/CHOICE",,"destinations":[{"Id":183},{"Id":165}]}]}
2 {"गंतव्य सूची":[{"नाम":"दूसरा परीक्षण",,"गंतव्य":[{"Id":103},{"Id":105}]},{"name":"ThirdTest", "गंतव्य":[{"Id":3},{"Id":5}]}]}
3 {"गंतव्य सूची":[{"name":"TVNZ, Discovery",,"destinations":[{"Id":165},{"Id":183},{"Id":4155}]} ,{"name":"TVNZ, Mediaworks, Choice","destinations":[]}]}

डीबी फिडल पर देखें

मुझे बताएं कि क्या यह आपके लिए काम करता है।




  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. Java BigDecimal को स्टोर करने के लिए किस PostgreSQL कॉलम प्रकार का उपयोग किया जाना चाहिए?

  3. आपदा वसूली के लिए PostgreSQL प्रतिकृति

  4. java.math.BigInteger को java.lang.Integer में नहीं डाला जा सकता है

  5. कॉलम डेटा अपडेट करने में त्रुटि पोस्टग्रेज करता है