PostgreSQL 9.0 या बाद में:
Postgres के हाल के संस्करणों (2010 के अंत से) में वह string_agg(expression, delimiter)
फ़ंक्शन होता है जो वही करेगा जो प्रश्न के लिए पूछा गया था, यहां तक कि आपको नाजुक स्ट्रिंग निर्दिष्ट करने देता है:
SELECT company_id, string_agg(employee, ', ')
FROM mytable
GROUP BY company_id;
9.0 पोस्टग्रेट्स ने किसी भी कुल अभिव्यक्ति में एक ORDER BY
खंड निर्दिष्ट करने की क्षमता को जोड़ा ; अन्यथा, आदेश अपरिभाषित है। तो अब आप लिख सकते हैं:
SELECT company_id, string_agg(employee, ', ' ORDER BY employee)
FROM mytable
GROUP BY company_id;
या वास्तव में:
SELECT string_agg(actor_name, ', ' ORDER BY first_appearance)
PostgreSQL 8.4 या बाद में:
PostgreSQL 8.4 (2009 में) ने एग्रीगेट फंक्शन कीarray_agg(expression)
शुरुआत की जो एक एरे में मूल्यों को समेटता है। तब array_to_string()
वांछित परिणाम देने के लिए इस्तेमाल किया जा सकता है:
SELECT company_id, array_to_string(array_agg(employee), ', ')
FROM mytable
GROUP BY company_id;
string_agg
पूर्व 8.4 संस्करणों के लिए:
यदि किसी को भी प्री-9.0 डेटाबेस के लिए कंपीटिबल शिम की तलाश में यह आता है, तो क्लॉज string_agg
को छोड़कर सब कुछ लागू करना संभव है ORDER BY
।
तो नीचे दी गई परिभाषा के साथ यह 9.x Postgres DB के समान काम करना चाहिए:
SELECT string_agg(name, '; ') AS semi_colon_separated_names FROM things;
लेकिन यह एक वाक्यविन्यास त्रुटि होगी:
SELECT string_agg(name, '; ' ORDER BY name) AS semi_colon_separated_names FROM things;
--> ERROR: syntax error at or near "ORDER"
PostgreSQL 8.3 पर परीक्षण किया गया।
CREATE FUNCTION string_agg_transfn(text, text, text)
RETURNS text AS
$$
BEGIN
IF $1 IS NULL THEN
RETURN $2;
ELSE
RETURN $1 || $3 || $2;
END IF;
END;
$$
LANGUAGE plpgsql IMMUTABLE
COST 1;
CREATE AGGREGATE string_agg(text, text) (
SFUNC=string_agg_transfn,
STYPE=text
);
कस्टम विविधताएं (सभी पोस्टग्रेज संस्करण)
9.0 से पहले, तारों को समेटने के लिए कोई अंतर्निहित एग्रीगेट फ़ंक्शन नहीं था। सबसे सरल कस्टम कार्यान्वयन ( इस मेलिंग सूची पोस्ट में वजदा गाबो द्वारा सुझाए गए , कई अन्य लोगों के बीच) अंतर्निहित textcat
फ़ंक्शन (जो ||
ऑपरेटर के पीछे स्थित है ) का उपयोग करना है:
CREATE AGGREGATE textcat_all(
basetype = text,
sfunc = textcat,
stype = text,
initcond = ''
);
यहाँ CREATE AGGREGATE
प्रलेखन है।
यह बस किसी भी विभाजक के साथ, सभी तारों को एक साथ जोड़ देता है। अंत में इसे बिना "बीच में" प्राप्त करने के लिए, आप अपना स्वयं का संयोजन कार्य करना चाहते हैं और इसे ऊपर दिए गए "टेक्स्टकैट" के लिए स्थानापन्न कर सकते हैं। यहाँ एक मैं एक साथ रखा और 8.3.12 पर परीक्षण किया है:
CREATE FUNCTION commacat(acc text, instr text) RETURNS text AS $$
BEGIN
IF acc IS NULL OR acc = '' THEN
RETURN instr;
ELSE
RETURN acc || ', ' || instr;
END IF;
END;
$$ LANGUAGE plpgsql;
यदि पंक्ति में मान शून्य या रिक्त है, तो भी यह संस्करण कॉमा आउटपुट करेगा, इसलिए आपको इस तरह से आउटपुट मिलता है:
a, b, c, , e, , g
यदि आप इसे आउटपुट करने के लिए अतिरिक्त कॉमा निकालना चाहते हैं:
a, b, c, e, g
फिर ELSIF
इस तरह फ़ंक्शन में एक चेक जोड़ें :
CREATE FUNCTION commacat_ignore_nulls(acc text, instr text) RETURNS text AS $$
BEGIN
IF acc IS NULL OR acc = '' THEN
RETURN instr;
ELSIF instr IS NULL OR instr = '' THEN
RETURN acc;
ELSE
RETURN acc || ', ' || instr;
END IF;
END;
$$ LANGUAGE plpgsql;