कम से कम पोस्टग्रेज 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;
कैसे?
-
jsonb
को अननेस्ट करें सरणी, प्रति सरणी तत्व 1 पंक्ति का उत्पादन:jsonb_array_elements(p.content) AS c(elem)
-
प्रत्येक तत्व के लिए
LEFT JOIN
images
. के लिए शर्तों पर
a. कुंजी 'प्रकार' का मान है 'इमेज':c.elem->>'type' = 'image'
ख.image_id
. में UUID मैच:i.id = (elem->>'image_id')::uuid
-
छवि प्रकारों के लिए, जहां एक मेल खाने वाली छवि मिली थी
c.elem->>'type' = 'image' AND i.id IS NOT NULL
कुंजी 'image_id' को हटा दें और संबंधित छवि पंक्ति को
jsonb
. के रूप में जोड़ें मूल्य:elem - 'image_id' || jsonb_build_object('image', i)
अन्यथा मूल तत्व को बनाए रखें।
-
संशोधित तत्वों को एक नई
content
में फिर से एकत्रित करेंjsonb_agg()
with के साथ कॉलम . -
बिना शर्त
LEFT JOIN LATERAL
posts
. का परिणाम और सभी कॉलम चुनें, केवलp.content
replace को बदलें उत्पन्न प्रतिस्थापन के साथc.content
-
बाहरी में
SELECT
, पूरी पंक्ति कोjsonb
. में बदलें एक साधारणto_jsonb()
. के साथ .
सभी jsonb
कार्यों को यहां मैनुअल में प्रलेखित किया गया है।