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

JSON डेटाटाइप में रिकॉर्ड के नेस्टेड सरणी के साथ क्वेरी संयोजन

इस तालिका को देखते हुए (जो आपको इस तरह के रूप में प्रदान करना चाहिए था):

CREATE TABLE reports (rep_id int primary key, data json);
INSERT INTO reports (rep_id, data)
VALUES 
  (1, '{"objects":[{"album": 1, "src":"fooA.png", "pos": "top"},   {"album": 2, "src":"barB.png", "pos": "top"}],   "background":"background.png"}')
, (2, '{"objects":[{"album": 1, "src":"fooA.png", "pos": "top"},   {"album": 2, "src":"barC.png", "pos": "top"}],   "background":"bacakground.png"}')
, (3, '{"objects":[{"album": 1, "src":"fooA.png", "pos": "middle"},{"album": 2, "src":"barB.png", "pos": "middle"}],"background":"background.png"}')
, (4, '{"objects":[{"album": 1, "src":"fooA.png", "pos": "top"},   {"album": 3, "src":"barB.png", "pos": "top"}],   "background":"backgroundA.png"}')
;

प्रसिद्ध, अनुवाद योग्य प्रकार के JSON रिकॉर्ड

json_populate_recordset() का उपयोग करें रिकॉर्डसेट को हटाने के लिए "objects" परिणामी कॉलम के नाम और डेटा प्रकार को परिभाषित करने के लिए फ़ंक्शन को एक पंजीकृत पंक्ति प्रकार की आवश्यकता होती है। इस डेमो के प्रयोजन के लिए या आम तौर पर तदर्थ प्रश्नों के लिए, एक अस्थायी तालिका "objects" . के बाद मॉडलिंग वही प्रदान करता है:

CREATE TEMP TABLE obj(album int, src text, pos text);

the top 3 most common combinations को खोजने के लिए ... of entries that have the same album, src, and background :

SELECT array_agg(r.rep_id) AS ids, count(*) AS ct
FROM   reports r
     , json_populate_recordset(null::obj, r.data->'objects') o
GROUP  BY r.data->>'background'
        , o.album
        , o.scr
ORDER  BY count(*) DESC
LIMIT  3;

प्रत्येक वस्तु मायने रखती है, चाहे वह एक ही पंक्ति से हो या नहीं। आपने यह परिभाषित नहीं किया कि इसे ठीक से कैसे संभालना है। नतीजतन, rep_id ids . सरणी में कई बार पॉप अप कर सकते हैं . DISTINCT जोड़ें करने के लिए array_agg() संभावित डुप्लिकेट को फोल्ड करने के लिए। गिनती ct सरणी की लंबाई से अधिक हो सकती है ids इस मामले में।

JSON फ़ंक्शंस और ऑपरेटरों के लिए पोस्टग्रेज़ 9.3 की आवश्यकता है और निहित JOIN LATERAL

अज्ञात या अनुवाद न करने योग्य प्रकार के JSON रिकॉर्ड

json_array_elements() परिणाम को SQL पंक्ति में परिवर्तित किए बिना बस json सरणी को अननेस्ट करता है। जेएसओएन ऑपरेटरों के साथ अलग-अलग फ़ील्ड तक पहुंचें।

SELECT array_agg(r.rep_id) AS ids, count(*) AS ct
FROM   reports r
     , json_array_elements(r.data->'objects') o
GROUP  BY r.data->>'background'
        , o->>'album'
        , o->>'scr'
ORDER  BY count(*) DESC
LIMIT  3;



  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. रेल ऐप में हेरोकू पोस्टग्रेएसक्यूएल GROUP_BY त्रुटि

  3. आप तारीख गणित कैसे करते हैं जो वर्ष की उपेक्षा करता है?

  4. अपडेट लॉक और अनलॉक के लिए चयन कब करता है?

  5. कैसे पता करें कि पोस्टग्रेएसक्यूएल 9.5+ यूपीएसईआरटी के साथ एक अप्सर्ट अपडेट था या नहीं?