TL;DR
SELECT json_agg(t) FROM t
वस्तुओं के JSON सरणी के लिए, और
SELECT
json_build_object(
'a', json_agg(t.a),
'b', json_agg(t.b)
)
FROM t
सरणी के JSON ऑब्जेक्ट के लिए।
वस्तुओं की सूची
यह खंड बताता है कि वस्तुओं की JSON सरणी कैसे उत्पन्न की जाती है, प्रत्येक पंक्ति को एक ही वस्तु में परिवर्तित किया जाता है। परिणाम इस तरह दिखता है:
[{"a":1,"b":"value1"},{"a":2,"b":"value2"},{"a":3,"b":"value3"}]
9.3 और ऊपर
json_agg
फ़ंक्शन इस परिणाम को बॉक्स से बाहर करता है। यह स्वचालित रूप से यह पता लगाता है कि इसके इनपुट को JSON में कैसे परिवर्तित किया जाए और इसे एक सरणी में एकत्रित किया जाए।
SELECT json_agg(t) FROM t
कोई jsonb
नहीं है (9.4 में प्रस्तुत) json_agg
. का संस्करण . आप या तो पंक्तियों को एक सरणी में एकत्रित कर सकते हैं और फिर उन्हें रूपांतरित कर सकते हैं:
SELECT to_jsonb(array_agg(t)) FROM t
या json_agg
combine को मिलाएं कलाकारों के साथ:
SELECT json_agg(t)::jsonb FROM t
मेरे परीक्षण से पता चलता है कि उन्हें पहले एक सरणी में एकत्रित करना थोड़ा तेज़ है। मुझे संदेह है कि ऐसा इसलिए है क्योंकि कलाकारों को पूरे JSON परिणाम को पार्स करना है।
9.2
9.2 में json_agg
नहीं है या to_json
फ़ंक्शन, इसलिए आपको पुराने array_to_json
. का उपयोग करने की आवश्यकता है :
SELECT array_to_json(array_agg(t)) FROM t
आप वैकल्पिक रूप से एक row_to_json
. शामिल कर सकते हैं क्वेरी में कॉल करें:
SELECT array_to_json(array_agg(row_to_json(t))) FROM t
यह प्रत्येक पंक्ति को JSON ऑब्जेक्ट में परिवर्तित करता है, JSON ऑब्जेक्ट को एक सरणी के रूप में एकत्रित करता है, और फिर सरणी को JSON सरणी में परिवर्तित करता है।
मैं दोनों के बीच कोई महत्वपूर्ण प्रदर्शन अंतर नहीं समझ पाया।
सूचियों का उद्देश्य
यह खंड वर्णन करता है कि JSON ऑब्जेक्ट कैसे उत्पन्न करें, प्रत्येक कुंजी तालिका में एक कॉलम है और प्रत्येक मान कॉलम के मानों की एक सरणी है। यह परिणाम इस तरह दिखता है:
{"a":[1,2,3], "b":["value1","value2","value3"]}
9.5 और ऊपर
हम json_build_object
का लाभ उठा सकते हैं समारोह:
SELECT
json_build_object(
'a', json_agg(t.a),
'b', json_agg(t.b)
)
FROM t
आप एकल पंक्ति बनाकर, स्तंभों को एकत्र भी कर सकते हैं, और फिर उसे एक ऑब्जेक्ट में बदल सकते हैं:
SELECT to_json(r)
FROM (
SELECT
json_agg(t.a) AS a,
json_agg(t.b) AS b
FROM t
) r
ध्यान दें कि यह सुनिश्चित करने के लिए कि ऑब्जेक्ट में वांछित नाम हैं, सरणियों को अलियासिंग करना नितांत आवश्यक है।
कौन सा स्पष्ट है यह राय का विषय है। अगर json_build_object
का इस्तेमाल कर रहे हैं फ़ंक्शन, मैं पठनीयता में सुधार के लिए एक कुंजी/मान जोड़ी को एक पंक्ति में रखने की अत्यधिक अनुशंसा करता हूं।
आप array_agg
. का भी उपयोग कर सकते हैं json_agg
. के स्थान पर , लेकिन मेरा परीक्षण इंगित करता है कि json_agg
थोड़ा तेज है।
कोई jsonb
नहीं है json_build_object
. का संस्करण समारोह। आप एक ही पंक्ति में एकत्रित हो सकते हैं और रूपांतरित कर सकते हैं:
SELECT to_jsonb(r)
FROM (
SELECT
array_agg(t.a) AS a,
array_agg(t.b) AS b
FROM t
) r
इस तरह के परिणाम के लिए अन्य प्रश्नों के विपरीत, array_agg
to_jsonb
. का उपयोग करते समय थोड़ा तेज़ लगता है . मुझे संदेह है कि यह ओवरहेड पार्सिंग और json_agg
के JSON परिणाम को मान्य करने के कारण है ।
या आप एक स्पष्ट कलाकार का उपयोग कर सकते हैं:
SELECT
json_build_object(
'a', json_agg(t.a),
'b', json_agg(t.b)
)::jsonb
FROM t
to_jsonb
संस्करण आपको कलाकारों से बचने की अनुमति देता है और मेरे परीक्षण के अनुसार तेज़ है; फिर से, मुझे संदेह है कि यह परिणाम को पार्स करने और सत्यापित करने के ऊपरी हिस्से के कारण है।
9.4 और 9.3
json_build_object
फ़ंक्शन 9.5 के लिए नया था, इसलिए आपको पिछले संस्करणों में किसी ऑब्जेक्ट को एकत्रित और परिवर्तित करना होगा:
SELECT to_json(r)
FROM (
SELECT
json_agg(t.a) AS a,
json_agg(t.b) AS b
FROM t
) r
या
SELECT to_jsonb(r)
FROM (
SELECT
array_agg(t.a) AS a,
array_agg(t.b) AS b
FROM t
) r
इस पर निर्भर करता है कि आप json
चाहते हैं या नहीं या jsonb
।
(9.3 में jsonb
नहीं है ।)
9.2
9.2 में, to_json
भी नहीं मौजूद। आपको row_to_json
. का उपयोग करना चाहिए :
SELECT row_to_json(r)
FROM (
SELECT
array_agg(t.a) AS a,
array_agg(t.b) AS b
FROM t
) r
दस्तावेज़ीकरण
JSON फ़ंक्शन में JSON फ़ंक्शन के लिए दस्तावेज़ खोजें।
json_agg
समग्र कार्य पृष्ठ पर है।
डिज़ाइन
यदि प्रदर्शन महत्वपूर्ण है, तो सुनिश्चित करें कि आप मेरे परीक्षण पर भरोसा करने के बजाय अपने स्वयं के स्कीमा और डेटा के विरुद्ध अपने प्रश्नों को बेंचमार्क करें।
यह एक अच्छा डिज़ाइन है या नहीं यह वास्तव में आपके विशिष्ट एप्लिकेशन पर निर्भर करता है। रखरखाव के मामले में, मुझे कोई विशेष समस्या नहीं दिख रही है। यह आपके ऐप कोड को सरल बनाता है और इसका मतलब है कि ऐप के उस हिस्से में बनाए रखने के लिए कम है। यदि पीजी आपको बिल्कुल सही परिणाम दे सकता है जिसकी आपको आवश्यकता है, तो इसका उपयोग न करने का एकमात्र कारण मैं प्रदर्शन पर विचार कर सकता हूं। पहिया और सभी का पुन:आविष्कार न करें।
शून्य
समग्र कार्य आमतौर पर NULL
वापस देते हैं जब वे शून्य पंक्तियों पर काम करते हैं। यदि यह एक संभावना है, तो आप COALESCE
. का उपयोग करना चाह सकते हैं उनसे बचने के लिए। कुछ उदाहरण:
SELECT COALESCE(json_agg(t), '[]'::json) FROM t
या
SELECT to_jsonb(COALESCE(array_agg(t), ARRAY[]::t[])) FROM t
इसे इंगित करने के लिए हेंस लैंडहोम को श्रेय