معاملات الوصول
a[N] – الوصول إلى عنصر في مصفوفة. الدالة arrayElement(a, N).
a.N – الوصول إلى عنصر في tuple. الدالة tupleElement(a, N).
معامل النفي العددي
-a – الدالة negate (a).
لنفي tuple: tupleNegate.
معاملات الضرب والقسمة
a * b – الدالة multiply (a, b).
لضرب Tuple في عدد: tupleMultiplyByNumber، ولحساب حاصل الضرب القياسي: dotProduct.
a / b – الدالة divide(a, b).
لقسمة Tuple على عدد: tupleDivideByNumber.
a % b – الدالة modulo(a, b).
معاملات الجمع والطرح
a + b – الدالة plus(a, b).
لجمع قيم Tuple: tuplePlus.
a - b – الدالة minus(a, b).
لطرح قيم Tuple: tupleMinus.
معاملات المقارنة
دالة equals
a = b – دالة equals(a, b).
a == b – دالة equals(a, b).
دالة notEquals
a != b – الدالة notEquals(a, b).
a <> b – الدالة notEquals(a, b).
دالة lessOrEquals
a <= b – هي الدالة lessOrEquals(a, b).
دالة greaterOrEquals
a >= b – تمثلها الدالة greaterOrEquals(a, b).
دالة less
a < b – الدالة less(a, b).
الدالة greater
a > b – الدالة greater(a, b).
الدالة like
a LIKE b – الدالة like(a, b).
دالة notLike
a NOT LIKE b – الدالة notLike(a, b).
دالة ilike
a ILIKE b – هي الدالة ilike(a, b).
دالة BETWEEN
a BETWEEN b AND c – تعادل a >= b AND a <= c.
a NOT BETWEEN b AND c – تعادل a < b OR a > c.
معامل “ليس مختلفًا عن” (<=>)
اعتبارًا من الإصدار 25.10، يمكنك استخدام
<=> بالطريقة نفسها التي تستخدم بها أي معامل آخر.
قبل الإصدار 25.10، لم يكن بالإمكان استخدامه إلا في تعبيرات JOIN، على سبيل المثال:<=> هو معامل مساواة آمن مع NULL، وهو مكافئ لـ IS NOT DISTINCT FROM.
وهو يعمل مثل معامل المساواة العادي (=)، لكنه يتعامل مع قيم NULL على أنها قابلة للمقارنة.
تُعدّ قيمتا NULL متساويتين، كما أن مقارنة NULL بأي قيمة غير NULL تُرجع 0 (false) بدلًا من NULL.
المعاملات الخاصة بالتعامل مع السلاسل النصية
OVERLAY
OVERLAY(string PLACING replacement FROM offset)- الدالةoverlay(string, replacement, offset).OVERLAY(string PLACING replacement FROM offset FOR length)- الدالةoverlay(string, replacement, offset, length).OVERLAYUTF8(string PLACING replacement FROM offset)- الدالةoverlayUTF8(string, replacement, offset).OVERLAYUTF8(string PLACING replacement FROM offset FOR length)- الدالةoverlayUTF8(string, replacement, offset, length).
المعاملات الخاصة بالعمل مع مجموعات البيانات
الدالة in
a IN ... – الدالة in(a, b).
دالة notIn
a NOT IN ... – الدالة notIn(a, b).
دالة globalIn
a GLOBAL IN ... – الدالة globalIn(a, b).
دالة globalNotIn
a GLOBAL NOT IN ... – الدالة globalNotIn(a, b).
دالة in للاستعلامات الفرعية
a = ANY (subquery) – وهي الدالة in(a, subquery).
notIn استعلام فرعي function
a != ANY (subquery) – وهو مماثل لـ a NOT IN (SELECT singleValueOrNull(*) FROM subquery).
دالة in استعلام فرعي
a = ALL (subquery) – هي نفسها a IN (SELECT singleValueOrNull(*) FROM subquery).
دالة notIn للاستعلام الفرعي
a != ALL (subquery) – الدالة notIn(a, subquery).
أمثلة
استعلام باستخدام ALL:
Query
Response
Query
Response
SOME / ALL على المصفوفات
SOME / ALL تعبيرَ مصفوفة (قيمة حرفية لمصفوفة، أو عمودًا من نوع مصفوفة، أو أي تعبير يُرجع مصفوفة). هذه هي صيغة مكمِّم المصفوفة بأسلوب PostgreSQL. ويُتعرَّف عليها أثناء التحليل وتُعاد كتابتها إلى دوال المصفوفات، لذلك لا حاجة إلى إعادة كتابتها يدويًا:
| الصياغة | تُعاد كتابتها إلى |
|---|---|
expr = SOME(arr) | has(arr, expr) |
expr <> ALL(arr) | NOT has(arr, expr) |
expr OP SOME(arr) (أي عامل مقارنة آخر) | arrayExists(x -> expr OP x, arr) |
expr OP ALL(arr) (أي عامل مقارنة آخر) | arrayAll(x -> expr OP x, arr) |
SOME المكمِّم الوجودي (وهو المرادف في SQL لـ ANY). وتُعامَل = و <> كحالتين خاصتين وتُحوَّلان إلى has / NOT has لأن لهما تنفيذًا مُحسَّنًا؛ أما الصيغة العامة فتعتمد على الدالتين الأعلى ترتيبًا arrayExists / arrayAll.
لا يُتعرَّف على صيغة المصفوفة إلا مع عوامل المقارنة =, ==, !=, <>, <=>, <, <=, >, و >=. أما العوامل الأخرى التي تقبل مصفوفة في الطرف الأيمن — مثل LIKE و ILIKE و NOT LIKE و REGEXP و IN — فلا تُعاد كتابتها إلى مكمِّم المصفوفة، وتحتفظ بمعناها المعتاد. على سبيل المثال، 'abc' LIKE SOME(['a%', 'b%']) ليست صيغة مكمِّم المصفوفة؛ استخدم arrayExists / arrayAll مباشرةً في تلك الحالات.
ANY غير مدعومة في صيغة المصفوفةلا يقبل الطرف الأيمن كمصفوفة إلا SOME و ALL. تُستبعَد ANY لأن any هي أيضًا دالة تجميع، لذلك يحتفظ التعبير بالشكل expr = any(x) بمعنى استدعاء الدالة. استخدم SOME لمكمِّم المصفوفة.Query
Response
تختلف معالجة
NULL عن صيغة الاستعلام الفرعيلأن صيغة المصفوفة يُعادَت صياغتها في المحلّل النحوي (حيث لا تكون إعدادات الاستعلام مثل transform_null_in متاحة، كما أن عمود المصفوفة على مستوى الصف لا يمكنه استخدام مسار IN الآمن مع NULL في المحلّل)، فإنها تستخدم الدلالات ثنائية القيمة لكل من has (مع = / <>) و arrayExists / arrayAll (اللذين يختزلان نتيجة مقارنة NULL غير المعروفة إلى 0). وقد يختلف ذلك عن صيغة الاستعلام الفرعي، إذ تُعالَج فيها NULL عبر IN / NOT IN وتعتمد على transform_null_in:المعاملات للعمل مع التواريخ والأوقات
EXTRACT
part أي جزء من التاريخ يجب استخراجه. القيم التالية متاحة:
NANOSECOND— النانوثانية. القيم الممكنة: 0–999999999.MICROSECOND— الميكروثانية. القيم الممكنة: 0–999999.MILLISECOND— الميلي ثانية. القيم الممكنة: 0–999.SECOND— الثانية. القيم الممكنة: 0–59.MINUTE— الدقيقة. القيم الممكنة: 0–59.HOUR— الساعة. القيم الممكنة: 0–23.DAY— يوم الشهر. القيم الممكنة: 1–31.WEEK— رقم الأسبوع وفق معيار ISO 8601. القيم الممكنة: 1–53.MONTH— رقم الشهر. القيم الممكنة: 1–12.QUARTER— الربع. القيم الممكنة: 1–4.YEAR— السنة.EPOCH— الطابع الزمني لـ Unix (الثواني منذ 1970-01-01 00:00:00 UTC). ملاحظة: بالنسبة إلىDateTime64، يُقتطع الجزء الأقل من الثانية.DOW— يوم الأسبوع (متوافق مع PostgreSQL). 0 = الأحد، 6 = السبت.DOY— يوم السنة. القيم الممكنة: 1–366.ISODOW— يوم الأسبوع وفق ISO. 1 = الاثنين، 7 = الأحد.ISOYEAR— سنة ترقيم الأسابيع وفق ISO 8601.CENTURY— القرن. على سبيل المثال، السنة 2024 تقع في القرن الحادي والعشرين.DECADE— العقد (السنة مقسومة على 10). على سبيل المثال، السنة 2024 عقدها 202.MILLENNIUM— الألفية. على سبيل المثال، السنة 2024 تقع في الألفية الثالثة.TIMEZONE_HOUR— جزء الساعات الموقَّع من إزاحة UTC للمنطقة الزمنية الخاصة بالمعامل. على سبيل المثال،+5:30تُرجع5، و-3:30تُرجع-3.TIMEZONE_MINUTE— جزء الدقائق الموقَّع من إزاحة UTC للمنطقة الزمنية الخاصة بالمعامل. على سبيل المثال،+5:30تُرجع30، و-3:30تُرجع-30.
part غير حساسة لحالة الأحرف.
تحدِّد المعلمة date القيمة المطلوب معالجتها. الأنواع Date وDate32 وDateTime وDateTime64 وInterval مدعومة. عندما تكون date من النوع Interval، يجب أن يطابق part المطلوب النوع المخزَّن في الـ interval (على سبيل المثال، يُسمح بـ EXTRACT(DAY FROM INTERVAL 5 DAY)؛ ويُرفَض EXTRACT(HOUR FROM INTERVAL 5 DAY)، لأن فواصل ClickHouse تكون من نوع واحد فقط). تكون نتيجة معامل Interval من النوع Int64.
أمثلة:
DateTime.
INTERVAL
SECONDMINUTEHOURDAYWEEKMONTHQUARTERYEAR
INTERVAL. على سبيل المثال، INTERVAL 1 HOUR مكافئ لـ INTERVAL '1 hour' أو INTERVAL '1' hour.
أمثلة:
يُفضَّل دائمًا استخدام صيغة
INTERVAL أو الدالة addDays. أمّا الجمع أو الطرح البسيط (بصيغة مثل now() + ...) فلا يأخذ إعدادات التوقيت في الحسبان، مثل التوقيت الصيفي.- Interval نوع البيانات
- toInterval دوال تحويل الأنواع
إضافة التاريخ والوقت
+. وتكون النتيجة DateTime أو DateTime64، وتمثل التاريخ عند الوقت المحدد من اليوم. هذه العملية إبدالية.
يعتمد نوع النتيجة على نوعَي المعاملين:
| المعامل الأيسر | المعامل الأيمن | نوع النتيجة |
|---|---|---|
Date | Time | DateTime |
Date | Time64(s) | DateTime64(s) |
Date32 | Time | DateTime64(0) |
Date32 | Time64(s) | DateTime64(s) |
تستخدم النتيجة المنطقة الزمنية للجلسة (أو المنطقة الزمنية الافتراضية للخادوم إذا لم يتم تعيين منطقة زمنية للجلسة). ويتحكم الإعداد
date_time_overflow_behavior في ما يحدث عندما تكون النتيجة خارج النطاق القابل للتمثيل.المعامل المنطقي AND
SELECT a AND b — تحسب الاقتران المنطقي لـ a وb باستخدام الدالة and.
معامل OR المنطقي
SELECT a OR b — يحسب الفصل المنطقي لـ a وb باستخدام الدالة or.
معامل النفي المنطقي
SELECT NOT a — تحسب النفي المنطقي لـ a باستخدام الدالة not.
المعامل الشرطي
a ? b : c – الدالة if(a, b, c).
ملاحظة:
يحسب المعامل الشرطي قيمتَي b و c، ثم يتحقق مما إذا كان الشرط a متحققًا، ثم يعيد القيمة المقابلة. إذا كانت b أو C دالة arrayJoin()، فسيُكرَّر كل صف بغض النظر عن الشرط “a”.
التعبير الشرطي
x محددًا، فستُستخدم الدالة transform(x, [a, ...], [b, ...], c). وإلا فستُستخدم multiIf(a, b, ..., c).
إذا لم تتضمن expression عبارة ELSE c، فستكون القيمة الافتراضية هي NULL.
لا تعمل الدالة transform مع NULL.
معامل ربط السلاسل
s1 || s2 – دالة concat(s1, s2).
معامل إنشاء Lambda
x -> expr – الدالة lambda(x, expr).
لا أولوية للمعاملات التالية لأنها أقواس:
معامل إنشاء المصفوفة
[x1, ...] – الدالة array(x1, ...).
معامل إنشاء Tuple
(x1, x2, ...) – الدالة tuple(x2, x2, ...).
الترابطية
1 + 2 + 3 إلى plus(plus(1, 2), 3).
وأحيانًا لا يعمل ذلك بالطريقة التي قد تتوقعها. فعلى سبيل المثال، تكون نتيجة SELECT 4 > 2 > 3 هي 0.
ولتحسين الكفاءة، تقبل الدالتان and وor أي عدد من الوسائط. وتُحوَّل سلاسل المعاملات AND وOR المقابلة إلى استدعاء واحد لهاتين الدالتين.
التحقق من وجود NULL
IS NULL وIS NOT NULL.
IS NULL
- بالنسبة إلى القيم من النوع Nullable، يعيد المعامل
IS NULLما يلي:1إذا كانت القيمةNULL.0بخلاف ذلك.
- بالنسبة إلى القيم الأخرى، يعيد المعامل
IS NULLدائمًا القيمة0.
optimize_functions_to_subcolumns = 1، تقرأ الدالة العمود الفرعي null فقط بدلًا من قراءة بيانات العمود بالكامل ومعالجتها. ويتحوّل الاستعلام SELECT n IS NULL FROM table إلى SELECT n.null FROM TABLE.
IS NOT NULL
- بالنسبة إلى القيم من النوع Nullable، يعيد المعامل
IS NOT NULLما يلي:0إذا كانت القيمةNULL.1في غير ذلك.
- بالنسبة إلى القيم الأخرى، يعيد المعامل
IS NOT NULLدائمًا1.
optimize_functions_to_subcolumns = 1، لا تقرأ الدالة سوى العمود الفرعي null بدلًا من قراءة بيانات العمود بالكامل ومعالجتها. ويتحوّل الاستعلام SELECT n IS NOT NULL FROM table إلى SELECT NOT n.null FROM TABLE.
التحقق من القيم المنطقية
IS TRUE وIS FALSE وIS UNKNOWN وIS NOT TRUE وIS NOT FALSE وIS NOT UNKNOWN.
تُستخدم هذه المعاملات مع تعبيرات Bool وNullable(Bool).
- يعيد
expr IS TRUEالقيمة1فقط إذا كانت قيمةexprهيtrue. - يعيد
expr IS FALSEالقيمة1فقط إذا كانت قيمةexprهيfalse. - يعيد
expr IS UNKNOWNالقيمة1فقط إذا كانت قيمةexprهيNULL. - يعيد
expr IS NOT TRUEالقيمة1إذا كانت قيمةexprهيfalseأوNULL. - يعيد
expr IS NOT FALSEالقيمة1إذا كانت قيمةexprهيtrueأوNULL. - يعيد
expr IS NOT UNKNOWNالقيمة1إذا لم تكن قيمةexprهيNULL.
IS UNKNOWN تكافئ IS NULL، وIS NOT UNKNOWN تكافئ IS NOT NULL.