المقدمة
يُعدّ تصفية جدول في ClickHouse باستخدام عمود مصفوفي مهمة شائعة، ويوفّر المنتج العديد من الدوال للتعامل مع الأعمدة من نوع Array.
في هذه المقالة، سنركّز على تصفية جدول باستخدام عمود مصفوفي، لكن الفيديو أدناه يستعرض أيضًا العديد من الدوال الأخرى المرتبطة بالمصفوفات:
مثال
سنستخدم مثالًا لجدول يضم عمودين هما tags_string وtags_int، ويحتويان على مصفوفة من السلاسل النصية ومصفوفة من الأعداد الصحيحة، على الترتيب.
- أنشئ قاعدة بيانات وجدولًا تجريبيين.
CREATE DATABASE db1;- أنشئ جدولًا تجريبيًا
CREATE TABLE db1.tags_table
(
`id` UInt64,
`tags_string` Array(String),
`tags_int` Array(UInt64),
)
ENGINE = MergeTree
ORDER BY id;- أدرِج بعض البيانات التجريبية في الجدول.
INSERT INTO db1.tags_table VALUES (1, ['tag1', 'tag2', 'tag3'], [1, 2, 3]), (2, ['tag2', 'tag3', 'tag4'], [2, 3, 4]), (3, ['tag1', 'tag3', 'tag5'], [1, 3, 5]);صفِّ الجدول باستخدام الدالة has(arr, elem) لإرجاع الصفوف التي تحتوي فيها arr على العنصر elem.
صفِّ الجدول لإرجاع الصفوف التي تحتوي فيها tags_string على العنصر tag1.
SELECT * FROM db1.tags_table WHERE has(tags_string, 'tag1');┌─id─┬─tags_string────────────┬─tags_int─┐
│ 1 │ ['tag1','tag2','tag3'] │ [1,2,3] │
│ 3 │ ['tag1','tag3','tag5'] │ [1,3,5] │
└────┴────────────────────────┴──────────┘استخدم الدالة hasAll(arr, elems) لإرجاع الصفوف التي تكون فيها جميع العناصر في المصفوفة elems موجودة ضمن المصفوفة arr.
قم بتصفية الجدول لإرجاع الصفوف التي تكون فيها جميع العناصر في المصفوفة tags_string موجودة ضمن المصفوفة ['tag1', 'tag2'].
SELECT * FROM db1.tags_table WHERE hasAll(tags_string, ['tag1', 'tag2']);┌─id─┬─tags_string────────────┬─tags_int─┐
│ 1 │ ['tag1','tag2','tag3'] │ [1,2,3] │
└────┴────────────────────────┴──────────┘استخدم الدالة hasAny(arr, elems) لإرجاع الصفوف التي تحتوي فيها المصفوفة arr على عنصر واحد على الأقل من المصفوفة elems.
صفِّ الجدول لإرجاع الصفوف التي تحتوي فيها المصفوفة tags_string على عنصر واحد على الأقل من المصفوفة ['tag1', 'tag2'].
SELECT * FROM db1.tags_table WHERE hasAny(tags_string, ['tag1', 'tag2']);┌─id─┬─tags_string────────────┬─tags_int─┐
│ 1 │ ['tag1','tag2','tag3'] │ [1,2,3] │
│ 2 │ ['tag2','tag3','tag4'] │ [2,3,4] │
│ 3 │ ['tag1','tag3','tag5'] │ [1,3,5] │
└────┴────────────────────────┴──────────┘يمكننا استخدام دالة لامبدا لتصفية الجدول باستخدام الدالة arrayExists(lambda, arr).
صفِّ الجدول لإرجاع الصفوف التي تحتوي فيها المصفوفة tags_int على عنصر واحد على الأقل أكبر من 3.
SELECT * FROM db1.tags_table WHERE arrayExists(x -> x > 3, tags_int);┌─id─┬─tags_string────────────┬─tags_int─┐
│ 2 │ ['tag2','tag3','tag4'] │ [2,3,4] │
│ 3 │ ['tag1','tag3','tag5'] │ [1,3,5] │
└────┴────────────────────────┴──────────┘