PostgreSQL 9.0 या उच्चतर:
आधुनिक पोस्टग्रेज (2010 से) में string_agg(expression, delimiter)
है फ़ंक्शन जो ठीक वही करेगा जो पूछने वाला ढूंढ रहा था:
SELECT company_id, string_agg(employee, ', ')
FROM mytable
GROUP BY company_id;
Postgres 9 ने ORDER BY
. निर्दिष्ट करने की क्षमता भी जोड़ी है किसी भी समग्र अभिव्यक्ति में खंड; अन्यथा आपको अपने सभी परिणामों का आदेश देना होगा या एक अपरिभाषित आदेश से निपटना होगा। तो अब आप लिख सकते हैं:
SELECT company_id, string_agg(employee, ', ' ORDER BY employee)
FROM mytable
GROUP BY company_id;
PostgreSQL 8.4.x:
PostgreSQL 8.4 (2009 में) ने समग्र कार्य array_agg(expression)
introduced की शुरुआत की जो एक सरणी में मान एकत्र करता है। फिर array_to_string()
वांछित परिणाम देने के लिए इस्तेमाल किया जा सकता है:
SELECT company_id, array_to_string(array_agg(employee), ', ')
FROM mytable
GROUP BY company_id;
PostgreSQL 8.3.x और पुराना:
जब यह प्रश्न मूल रूप से सामने आया था, तो स्ट्रिंग्स को जोड़ने के लिए कोई अंतर्निहित समग्र कार्य नहीं था। सबसे सरल कस्टम कार्यान्वयन (इस मेलिंग सूची पोस्ट में कई अन्य लोगों के बीच में वाजदा गाबो द्वारा सुझाया गया) अंतर्निहित 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;