كيفية دمج السلاسل في استعلام مجموعة PostgreSQL

عند العمل مع قواعد البيانات، وخاصة مع PostgreSQL، من المحتمل أن تواجه سيناريو شائع حيث تحتاج إلى دمج السلاسل ضمن مجموعة من السجلات. هذا يحدث عادة عندما يكون لديك مجموعة بيانات تتضمن عدة إدخالات لفئة واحدة (مثل الموظفين في نفس الشركة) وترغب في تجميع تلك الإدخالات في سلسلة واحدة للعرض أو التحليل.

ستوضح لك هذه المقالة كيفية تحقيق دمج السلاسل باستخدام استعلام GROUP BY في PostgreSQL. سنغطي الحلول الحديثة وكذلك الطرق للإصدارات الأقدم من PostgreSQL لفهم شامل.

المشكلة

على سبيل المثال، ضع في اعتبارك جدول الموظفين التالي:

ID COMPANY_ID EMPLOYEE
1 1 آنا
2 1 بيل
3 2 كارول
4 2 ديف

تريد تجميع هذه الإدخالات حسب COMPANY_ID بحيث يقدم الإخراج قائمة بالموظفين المرتبطين بكل شركة. يجب أن يبدو الإخراج المطلوب كما يلي:

COMPANY_ID EMPLOYEE
1 آنا، بيل
2 كارول، ديف

الحل

PostgreSQL 9.0 أو أحدث

إذا كنت تستخدم PostgreSQL إصدار 9.0 أو أحدث، يمكنك استخدام الدالة المدمجة القوية string_agg() لدمج السلاسل ضمن عبارة GROUP BY بفعالية.

إليك كيفية كتابة الاستعلام:

SELECT company_id, string_agg(employee, ', ')
FROM mytable
GROUP BY company_id;

مع ترتيب

بالإضافة إلى ذلك، since يدعم PostgreSQL اعتبارًا من الإصدار 9.0 ORDER BY داخل الدوال التجميعية، يمكنك تحديد ترتيب الموظفين:

SELECT company_id, string_agg(employee, ', ' ORDER BY employee)
FROM mytable
GROUP BY company_id;

هذا يضمن أن أسماء الموظفين يتم دمجها في ترتيب محدد.

PostgreSQL 8.4.x

إذا كنت لا تزال تعمل مع PostgreSQL 8.4، وهو إصدار لم يعد يتلقى الدعم، يمكنك استخدام دالة array_agg() بالاشتراك مع array_to_string() لتحقيق نتائج مشابهة. إليك استعلام SQL الذي يمكنك استخدامه:

SELECT company_id, array_to_string(array_agg(employee), ', ')
FROM mytable
GROUP BY company_id;

PostgreSQL 8.3.x والإصدارات الأقدم

بالنسبة لمستخدمي PostgreSQL 8.3 والإصدارات الأقدم، لا توجد دالة مدمجة لأداء دمج السلاسل مباشرة. يمكن أن تعمل التنفيذات المخصصة التالية حول هذا القيد:

  1. قم بإنشاء دالة تجميع جديدة باستخدام الدالة textcat:
CREATE AGGREGATE textcat_all(
  basetype    = text,
  sfunc       = textcat,
  stype       = text,
  initcond    = ''
);
  1. لإضافة فواصل مثل ، بين السلاسل المدمجة، أنشئ دالة مخصصة:
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;

سيتم دمج السلاسل بشكل مناسب.

إذا كنت تريد إزالة الفواصل الزائدة للقيم NULL أو القيم الفارغة، إليك نسخة أكثر تنقيحًا:

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;

الخاتمة

يعد دمج السلاسل في PostgreSQL، خاصةً أثناء عمليات GROUP BY، أمرًا حيويًا لإنشاء تقارير ومجموعات بيانات ذات مغزى. مع إدخال دوال مثل string_agg() في الإصدارات الحديثة، أصبح هذا المهمة بسيطة.

إذا كنت تستخدم إصدارًا قديمًا، فإن استخدام طرق التجميع المخصصة الموضحة هنا قد يحقق نتائج مشابهة. دائمًا ما يُنصح بترقية إصدار PostgreSQL الخاص بك للاستفادة من الميزات الجديدة وتحسينات الأمان.

استمتع بالاستعلام!