استخدام STRING_AGG لنتائج استعلام موجزة

تُعد الدالة string_agg في SQL دالة تجميعية تقوم بدمج (ربط) السلاسل النصية من صفوف متعددة في سلسلة نصية واحدة مع خيارات متنوعة.

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

بناء الجملة

إليك بناء الجملة الأساسي للدالة string_agg:

STRING_AGG(expression, delimiter)

تأخذ الدالة string_agg مُعاملين:

  • expression: القيمة التي سيتم دمجها.
  • delimiter: الفاصل الذي سيتم إدراجه بين السلاسل النصية. يمكن أن يكون الفاصل سلسلة نصية أو حرفًا.

مثال على الاستخدام في استعلامات DE

دعنا نلقي نظرة على بعض الاستعلامات النموذجية التي تستخدم string_agg

قائمة بجميع الفئات على موقع

يقوم هذا الاستعلام بدمج حقلي name و id من جدول categories في سلسلة نصية واحدة، مع فصل كل زوج من name و id بـ ’ : '، وفصل كل زوج بـ ', '. ثم يتم ترتيب الأزواج حسب id.

SELECT  
    -- تقوم الدالة STRING_AGG بدمج حقلي 'name' و 'id' في سلسلة نصية واحدة.
    -- يتم فصل كل زوج من 'name' و 'id' بـ ' : '، ويتم فصل كل زوج بـ ', '.
    -- يتم ترتيب الأزواج حسب 'id'.
    STRING_AGG(name || ' : ' || id, ', ' ORDER BY id) AS category_list
FROM 
    categories -- يتم اختيار البيانات من جدول 'categories'.

نتائج نموذجية:

category_list
غير مصنف : 1, ملاحظات الموقع : 2, فريق العمل : 3, صالة : 4, بريد إلكتروني : 5, حدث : 6, فئة رئيسية : 7, فئة فرعية

قائمة بجميع المواضيع والعلامات المرتبطة بها

يقوم هذا الاستعلام باختيار id من جدول topics ويدمج العلامات المرتبطة (tags) لكل موضوع في سلسلة نصية واحدة. يتم فصل كل علامة بفاصلة ومسافة، ويتم ترتيب العلامات أبجديًا. يتم تجميع النتيجة حسب id الموضوع وترتيبها حسب العلامات. إذا لم يكن للموضوع أي علامات، فسيكون عمود tags هو NULL.

SELECT t.id topic_id,
    string_agg(tags.name, ', ' ORDER BY tags.name) AS "tags"
FROM topics t
LEFT JOIN topic_tags tt ON tt.topic_id = t.id
LEFT JOIN tags ON tags.id = tt.tag_id
GROUP BY t.id   
ORDER BY tags

ستكون النتيجة قائمة بمعرفات المواضيع المنسقة، كل منها بسلسلة من العلامات المرتبطة مرتبة أبجديًا. على سبيل المثال:

نتائج نموذجية:

topic tags
مرحبًا بك في الصالة (3) tag1, tag2
منشور آمن جدًا للعمل (3) tag3, tag4, tag,5
هذا منشور مدونة بعلامات (4) tag3
حول فئة الصالة (3) tag5
مرحبًا بتجربتك القياسية لمدة 14 يومًا! NULL
شرح مفصل مع تعليقات مضمنة
-- تحدد عبارة SQL هذه بيانات من جدول 'topics' و 'tags' المرتبطة.
SELECT 
    t.id topic_id, -- حدد 'id' من جدول 'topics'.
    -- تقوم الدالة STRING_AGG بدمج العلامات المرتبطة لكل موضوع في سلسلة نصية واحدة.
    -- يتم فصل كل علامة بفاصلة ومسافة، ويتم ترتيب العلامات أبجديًا.
    string_agg(tags.name, ', ' ORDER BY tags.name) AS "tags"
FROM 
    topics t -- يتم اختيار البيانات من جدول 'topics'.
    -- يتم ربط جدول 'topic_tags' باستخدام 'topic_id' من جدول 'topics'.
    LEFT JOIN topic_tags tt ON tt.topic_id = t.id
    -- يتم ربط جدول 'tags' باستخدام 'tag_id' من جدول 'topic_tags'.
    LEFT JOIN tags ON tags.id = tt.tag_id
GROUP BY 
    t.id -- يتم تجميع النتيجة حسب 'id' الموضوع.
ORDER BY
    "tags" -- يتم ترتيب النتيجة حسب 'tags'.

المستخدمون الذين نشروا في المواضيع

سيعيد هذا الاستعلام قائمة بمعرفات المواضيع (topic ids) وعناوينها (titles)، وأسماء المستخدمين (usernames) للمستخدمين الذين نشروا في كل موضوع، وعدد المستخدمين المميزين (count of distinct users) الذين نشروا في كل موضوع. ثم يتم ترتيب النتائج حسب عدد المستخدمين، بترتيب تنازلي.

SELECT
    topics.id AS "topic_id",
    topics.title AS "topic_title",
    STRING_AGG(DISTINCT users.username, ', ' ORDER BY users.username) AS "users_posted",
    COUNT(DISTINCT users.id) AS "user_count"
FROM
    topics
JOIN
    posts ON posts.topic_id = topics.id
JOIN
    users ON users.id = posts.user_id
GROUP BY
    topics.id, topics.title
ORDER BY
    "user_count" DESC

نتائج نموذجية

topic topic_title users_posted user_count
دعنا ننشئ موضوعًا (10) دعنا ننشئ موضوعًا anonymous, user1, user2, user3 4
موضوع آخر (3) موضوع آخر user3, user4, user5 3
اختبار Discobot (2) اختبار Discobot user6 1
شرح مفصل مع تعليقات مضمنة
-- تحدد عبارة SQL هذه بيانات من جداول 'topics'، 'posts'، و 'users'.
SELECT
    topics.id AS "topic_id", -- حدد 'id' من جدول 'topics'.
    topics.title AS "topic_title", -- حدد 'title' من جدول 'topics'.
    -- تقوم الدالة STRING_AGG بدمج أسماء المستخدمين للمستخدمين الذين نشروا في الموضوع في سلسلة نصية واحدة.
    -- يتم فصل كل اسم مستخدم بفاصلة ومسافة، ويتم ترتيب أسماء المستخدمين أبجديًا.
    STRING_AGG(DISTINCT users.username, ', ' ORDER BY users.username) AS "users_posted",
    -- احسب عدد المستخدمين المميزين الذين نشروا في الموضوع.
    COUNT(DISTINCT users.id) AS "user_count"
FROM
    topics -- يتم اختيار البيانات من جدول 'topics'.
    -- يتم ربط جدول 'posts' باستخدام 'topic_id' من جدول 'topics'.
    JOIN posts ON posts.topic_id = topics.id
    -- يتم ربط جدول 'users' باستخدام 'id' من جدول 'posts'.
    JOIN users ON users.id = posts.user_id
GROUP BY
    topics.id, topics.title -- يتم تجميع النتيجة حسب 'id' و 'title' الموضوع.
ORDER BY
    "user_count" DESC -- يتم ترتيب النتيجة حسب عدد المستخدمين، بترتيب تنازلي.

هذا كل شيء لهذا البرنامج التعليمي!

إذا كانت لديك أي أسئلة أو أمثلة حول كيفية استخدامك للدالة string_agg، فلا تتردد في مشاركتها أدناه. :slightly_smiling_face:

6 إعجابات