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

Postgres में jsonb सरणी तत्वों से कैसे जुड़ें?

कम से कम पोस्टग्रेज 9.5 मानते हुए, यह काम करेगा:

SELECT jsonb_pretty(to_jsonb(p)) AS post_row_as_json
FROM  (
   SELECT id, title, author_id, c.content
   FROM   posts p
   LEFT   JOIN LATERAL (
      SELECT jsonb_agg(
               CASE WHEN c.elem->>'type' = 'image' AND i.id IS NOT NULL
                    THEN elem - 'image_id' || jsonb_build_object('image', i)
                    ELSE c.elem END) AS content
      FROM   jsonb_array_elements(p.content) AS c(elem)
      LEFT   JOIN images i ON c.elem->>'type' = 'image'
                          AND i.id = (elem->>'image_id')::uuid
      ) c ON true
   ) p;

कैसे?

  1. jsonb को अननेस्ट करें सरणी, प्रति सरणी तत्व 1 पंक्ति का उत्पादन:

    jsonb_array_elements(p.content) AS c(elem)
    
  2. प्रत्येक तत्व के लिए LEFT JOIN images . के लिए शर्तों पर
    a. कुंजी 'प्रकार' का मान है 'इमेज':c.elem->>'type' = 'image'
    ख. image_id . में UUID मैच:i.id = (elem->>'image_id')::uuid

  3. छवि प्रकारों के लिए, जहां एक मेल खाने वाली छवि मिली थी

    c.elem->>'type' = 'image' AND i.id IS NOT NULL
    

    कुंजी 'image_id' को हटा दें और संबंधित छवि पंक्ति को jsonb . के रूप में जोड़ें मूल्य:

    elem - 'image_id' || jsonb_build_object('image', i)
    

    अन्यथा मूल तत्व को बनाए रखें।

  4. संशोधित तत्वों को एक नई content में फिर से एकत्रित करें jsonb_agg() with के साथ कॉलम .

  5. बिना शर्त LEFT JOIN LATERAL posts . का परिणाम और सभी कॉलम चुनें, केवल p.content replace को बदलें उत्पन्न प्रतिस्थापन के साथ c.content

  6. बाहरी में SELECT , पूरी पंक्ति को jsonb . में बदलें एक साधारण to_jsonb() . के साथ .

सभी jsonb कार्यों को यहां मैनुअल में प्रलेखित किया गया है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एक सरणी का Nth तत्व प्राप्त करें जो string_to_array () फ़ंक्शन से लौटाता है

  2. PostgreSQL में Exp () फ़ंक्शन कैसे काम करता है

  3. Postgresql के भीतर वितरित लेनदेन को कैसे संसाधित करें?

  4. किसी फ़ंक्शन में अद्यतन या चयन कथन में गतिशील कॉलम नामों का उपयोग कैसे करें?

  5. PostgreSQL WHERE क्लॉज में कॉलम उपनाम स्वीकार नहीं करता है