الانتقال إلى المحتوى الرئيسي
هذه دالة غير اعتيادية للغاية. الدوال العادية لا تغيّر مجموعة من الصفوف، بل تغيّر فقط القيم في كل صف (map). أما الدوال التجميعية فتضغط مجموعة من الصفوف (الطي أو الاختزال). وتأخذ الدالة arrayJoin كل صف وتولّد منه مجموعة من الصفوف (الفرد). تأخذ هذه الدالة مصفوفة كوسيط، وتكرّر الصف الأصلي إلى عدة صفوف بعدد العناصر الموجودة في المصفوفة. وتُنسخ جميع القيم في الأعمدة كما هي، باستثناء القيم في العمود الذي تُطبَّق عليه هذه الدالة، إذ تُستبدل بقيمة العنصر المقابل من المصفوفة.
إذا كانت المصفوفة فارغة، فإن arrayJoin لا ينتج أي صفوف. ولإرجاع صف واحد يحتوي على القيمة الافتراضية لنوع المصفوفة، يمكنك تغليفها بـ emptyArrayToSingle، على سبيل المثال: arrayJoin(emptyArrayToSingle(...)).
على سبيل المثال:
Query
SELECT arrayJoin([1, 2, 3] AS src) AS dst, 'Hello', src
Response
┌─dst─┬─\'Hello\'─┬─src─────┐
│   1 │ Hello     │ [1,2,3] │
│   2 │ Hello     │ [1,2,3] │
│   3 │ Hello     │ [1,2,3] │
└─────┴───────────┴─────────┘
تؤثر الدالة arrayJoin في جميع أجزاء الاستعلام، بما في ذلك قسم WHERE. لاحظ أن نتيجة الاستعلام أدناه هي 2، رغم أن الاستعلام الفرعي أعاد صفًا واحدًا.
Query
SELECT sum(1) AS impressions
FROM
(
    SELECT ['Istanbul', 'Berlin', 'Babruysk'] AS cities
)
WHERE arrayJoin(cities) IN ['Istanbul', 'Berlin'];
Response
┌─impressions─┐
│           2 │
└─────────────┘
يمكن للاستعلام استخدام عدة دوال arrayJoin. في هذه الحالة، يُنفَّذ التحويل عدة مرات وتتضاعف الصفوف. على سبيل المثال:
Query
SELECT
    sum(1) AS impressions,
    arrayJoin(cities) AS city,
    arrayJoin(browsers) AS browser
FROM
(
    SELECT
        ['Istanbul', 'Berlin', 'Babruysk'] AS cities,
        ['Firefox', 'Chrome', 'Chrome'] AS browsers
)
GROUP BY
    2,
    3
Response
┌─impressions─┬─city─────┬─browser─┐
│           2 │ Istanbul │ Chrome  │
│           1 │ Istanbul │ Firefox │
│           2 │ Berlin   │ Chrome  │
│           1 │ Berlin   │ Firefox │
│           2 │ Babruysk │ Chrome  │
│           1 │ Babruysk │ Firefox │
└─────────────┴──────────┴─────────┘

أفضل الممارسات

قد لا يؤدي استخدام عدة arrayJoin مع التعبير نفسه إلى النتائج المتوقعة بسبب إزالة التعبيرات الفرعية المشتركة. في هذه الحالات، يُنصح بتعديل تعبيرات المصفوفة المكررة عبر إضافة عمليات لا تؤثر في نتيجة arrayJoin. على سبيل المثال، arrayJoin(arraySort(arr)), arrayJoin(arrayConcat(arr, [])) مثال:
Query
SELECT
    arrayJoin(dice) AS first_throw,
    /* arrayJoin(dice) as second_throw */ -- is technically correct, but will annihilate result set
    arrayJoin(arrayConcat(dice, [])) AS second_throw -- intentionally changed expression to force re-evaluation
FROM (
    SELECT [1, 2, 3, 4, 5, 6] AS dice
);
لاحظ بنية ARRAY JOIN في استعلام SELECT، إذ تتيح إمكانات أوسع. يتيح ARRAY JOIN تحويل عدة مصفوفات لها العدد نفسه من العناصر دفعةً واحدة. مثال:
Query
SELECT
    sum(1) AS impressions,
    city,
    browser
FROM
(
    SELECT
        ['Istanbul', 'Berlin', 'Babruysk'] AS cities,
        ['Firefox', 'Chrome', 'Chrome'] AS browsers
)
ARRAY JOIN
    cities AS city,
    browsers AS browser
GROUP BY
    2,
    3
Response
┌─impressions─┬─city─────┬─browser─┐
│           1 │ Istanbul │ Firefox │
│           1 │ Berlin   │ Chrome  │
│           1 │ Babruysk │ Chrome  │
└─────────────┴──────────┴─────────┘
أو يمكنك استخدام Tuple مثال:
Query
SELECT
    sum(1) AS impressions,
    (arrayJoin(arrayZip(cities, browsers)) AS t).1 AS city,
    t.2 AS browser
FROM
(
    SELECT
        ['Istanbul', 'Berlin', 'Babruysk'] AS cities,
        ['Firefox', 'Chrome', 'Chrome'] AS browsers
)
GROUP BY
    2,
    3
Row
┌─impressions─┬─city─────┬─browser─┐
│           1 │ Istanbul │ Firefox │
│           1 │ Berlin   │ Chrome  │
│           1 │ Babruysk │ Chrome  │
└─────────────┴──────────┴─────────┘
يأتي اسم arrayJoin في ClickHouse من تشابهه المفاهيمي مع عملية JOIN، ولكن عند تطبيقها على المصفوفات داخل صف واحد. فبينما تدمج عمليات JOIN التقليدية الصفوف من جداول مختلفة، يقوم arrayJoin “بضم” كل عنصر من عناصر المصفوفة داخل الصف، مما ينتج عنه عدة صفوف — صف واحد لكل عنصر في المصفوفة — مع تكرار قيم الأعمدة الأخرى. كما يوفّر ClickHouse أيضًا صياغة البند ARRAY JOIN، مما يجعل هذه الصلة بعمليات JOIN التقليدية أكثر وضوحًا من خلال استخدام مصطلحات SQL JOIN المألوفة. ويُشار إلى هذه العملية أيضًا باسم “فرد” المصفوفة، لكن يُستخدم مصطلح “join” في كلٍّ من اسم الدالة والبند لأنه يشبه ضم الجدول إلى عناصر المصفوفة، مما يؤدي فعليًا إلى توسيع مجموعة البيانات بطريقة مشابهة لعملية JOIN.
آخر تعديل في ٢٥ يونيو ٢٠٢٦