एक string_agg() बिल्टिन है जो आप जो चाहते हैं वह करता है, लेकिन आप विशेष रूप से इसे MySQL संगतता के लिए group_concat नाम देने के लिए कहते हैं। दुर्भाग्य से, string_agg() संचय के लिए एक आंतरिक डेटा प्रकार का उपयोग करता है (संभवतः प्रत्येक परिशिष्ट पर पूरे बफर की प्रतिलिपि बनाने से बचने के लिए, मैंने हालांकि स्रोत को नहीं देखा है) और मुझे string_agg के समान SQL कुल घोषित करने का कोई तरीका नहीं मिला ( )।
Group_concat() फ़ंक्शन को परिभाषित करना या तो काम नहीं करेगा, क्योंकि pg को इस बात से अवगत कराना होगा कि यह एक समुच्चय है, न कि एक ऐसा फ़ंक्शन जिसमें कुल छिपा हुआ है, जो काम नहीं करेगा। ऐसा फ़ंक्शन एक समय में एक पंक्ति पर काम करेगा:अंदर का कोई भी समुच्चय केवल एक पंक्ति को एकत्रित करेगा और इसे अपरिवर्तित लौटाएगा...
इस प्रकार, यह कोड तत्वों को एक सरणी में जमा करेगा, फिर "," सीमांकक को array_to_string के साथ जोड़ देगा। मैं एक मॉडल के रूप में array_agg() डिक्लेरेशन (इससे पहले कि यह एक बिल्ट-इन बन गया) का उपयोग करूँगा, और बस एक फ़ाइनलाइज़र फ़ंक्शन जोड़ूंगा जो एग्रीगेट किए गए ऐरे को टेक्स्ट में बदल देगा।
CREATE OR REPLACE FUNCTION _group_concat_finalize(anyarray)
RETURNS text AS $$
SELECT array_to_string($1,',')
$$ IMMUTABLE LANGUAGE SQL;
CREATE AGGREGATE group_concat(anyelement) (
SFUNC=array_append,
STYPE=anyarray,
FFUNC=_group_concat_finalize,
INITCOND='{}'
);
SELECT group_concat(x) FROM foo;
अच्छी बात यह है कि यह बिना किसी परेशानी के किसी भी प्रकार के लिए ठीक काम करना चाहिए, सामान्य प्रकार "anyarray" और "anyelement" के लिए धन्यवाद।
मुझे लगता है कि यह string_agg() से धीमा होगा यदि string_agg वास्तव में प्रत्येक परिशिष्ट पर संपूर्ण एकत्रीकरण सरणी की प्रतिलिपि बनाने से बचता है। यह तभी मायने रखता है जब प्रत्येक सेट में समूहबद्ध की जाने वाली पंक्तियों की संख्या बड़ी हो। इस मामले में, आप शायद SQL क्वेरी को संपादित करने में एक मिनट खर्च कर सकते हैं;)
http://sqlfiddle.com/#!17/c452d/1