PostgreSQL 9.0 বা তার পরে:
পোস্টগ্রিসের সাম্প্রতিক সংস্করণগুলিতে (২০১০ সালের শেষের দিকে) 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 বা তারপরে:
পোস্টগ্র্যাসকিউএল 8.4 (২০০৯ সালে) সামগ্রিক ফাংশনটি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-পূর্বের 9.0 ডাটাবেসগুলির জন্য একটি কম্প্যাটিবিলিটি শিমের সন্ধান করতে আসে, তবে ক্লজটি string_agg
বাদে সমস্ত কিছু কার্যকর করা সম্ভব ORDER BY
।
সুতরাং নীচের সংজ্ঞা দিয়ে এটি 9.x পোস্টগ্রিস ডিবি-র মতো একই কাজ করবে:
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;