تُعد الدالة 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، فلا تتردد في مشاركتها أدناه. ![]()