आप पहले शामिल होने के परिणाम को JSON के रूप में मानते हैं, टेक्स्ट स्ट्रिंग के रूप में नहीं, इसलिए jsonb_each()
का उपयोग करें इसके बजाय jsonb_each_text()
:
SELECT t.employee, json_object_agg(a.k, d.value) AS sales
FROM mytable t
JOIN LATERAL jsonb_each(t.data) a(k,v) ON a.k LIKE 'sales_%'
JOIN LATERAL jsonb_to_recordset(a.v) d(yr text, value float) ON d.yr = '2012'
WHERE t.employee = 'Jim' -- works because employee is unique
GROUP BY 1;
GROUP BY 1
GROUP BY t.employee
. के लिए शॉर्टहैंड है .
परिणाम:
employee | sales
---------+--------
Jim | '{ "sales_tv" : 40, "sales_radio" : 76 }'
मैंने आपकी क्वेरी को भी सुलझाया और सरल बनाया।
json_object_agg()
JSON ऑब्जेक्ट के रूप में नाम/मूल्य जोड़े को एकत्रित करने में महत्वपूर्ण भूमिका निभाता है। वैकल्पिक रूप से jsonb
पर कास्ट करें यदि आपको इसकी आवश्यकता है - या jsonb_object_agg()
. का उपयोग करें पोस्टग्रेज 9.5 या बाद के संस्करण में।
स्पष्ट JOIN
का उपयोग करना शर्तों को उनके सबसे स्पष्ट स्थान पर संलग्न करने के लिए वाक्य रचना।
वही बिना स्पष्ट JOIN
वाक्य रचना:
SELECT t.employee, json_object_agg(a.k, d.value) AS sales
FROM mytable t
, jsonb_each(t.data) a(k,v)
, jsonb_to_recordset(a.v) d(yr text, value float)
WHERE t.employee = 'Jim'
AND a.k LIKE 'sales_%'
AND d.yr = '2012'
GROUP BY 1;