الانتقال إلى المحتوى الرئيسي

نظرة عامة

استخدام النتائج الشرطية مباشرةً

تُرجع التعبيرات الشرطية دائمًا 0 أو 1 أو NULL. لذا يمكنك استخدام نتائجها مباشرةً كما يلي:

قيم NULL في التعبيرات الشرطية

عند وجود قيم NULL في التعبيرات الشرطية، تكون النتيجة أيضًا NULL.
لذلك ينبغي إنشاء استعلاماتك بعناية إذا كانت الأنواع Nullable. ويوضح المثال التالي ذلك، إذ يفشل بسبب عدم إضافة شرط equals إلى multiIf.

عبارة CASE

يوفّر التعبير CASE في ClickHouse منطقًا شرطيًا مشابهًا لمعامل CASE في SQL. إذ يقيّم الشروط ويُرجع القيم بناءً على أول شرط متطابق. يدعم ClickHouse شكلين لعبارة CASE:
  1. CASE WHEN ... THEN ... ELSE ... END
    يوفّر هذا الشكل مرونة كاملة، ويُنفَّذ داخليًا باستخدام الدالة multiIf. ويُقيَّم كل شرط على نحو مستقل، ويمكن أن تتضمن التعبيرات قيمًا غير ثابتة.
  1. CASE <expr> WHEN <val1> THEN ... WHEN <val2> THEN ... ELSE ... END
    هذا الشكل الأكثر اختصارًا مُحسَّن لمطابقة القيم الثابتة، ويستخدم داخليًا caseWithExpression().
على سبيل المثال، ما يلي صحيح:
هذه الصيغة أيضًا لا تشترط أن تكون تعبيرات الإرجاع ثوابت.

محاذير

يحدّد ClickHouse نوع نتيجة تعبير CASE (أو ما يكافئه داخليًا، مثل multiIf) قبل تقييم أي شروط. ويكتسب هذا أهمية عندما تختلف تعبيرات الإرجاع في النوع، مثل اختلاف المناطق الزمنية أو الأنواع الرقمية.
  • يُختار نوع النتيجة بناءً على أكبر نوع متوافق بين جميع الفروع.
  • وبمجرد اختيار هذا النوع، تُحوَّل جميع الفروع الأخرى إليه ضمنيًا - حتى إن كان منطقها لن يُنفَّذ مطلقًا أثناء التشغيل.
  • بالنسبة إلى أنواع مثل DateTime64، حيث تكون المنطقة الزمنية جزءًا من تعريف النوع، فقد يؤدي ذلك إلى سلوك غير متوقع: إذ قد تُستخدم أول منطقة زمنية تمت مصادفتها في جميع الفروع، حتى عندما تحدد الفروع الأخرى مناطق زمنية مختلفة.
على سبيل المثال، في ما يلي تُرجع جميع الصفوف الطابع الزمني وفق المنطقة الزمنية لأول فرع مطابق، أي Asia/Kolkata
هنا، يرى ClickHouse عدة أنواع إرجاع DateTime64(3, <timezone>). ويستنتج أن النوع المشترك هو DateTime64(3, 'Asia/Kolkata' لأنه أول نوع يصادفه، ويحوّل الفروع الأخرى ضمنيًا إلى هذا النوع. يمكن معالجة ذلك بالتحويل إلى سلسلة نصية للحفاظ على تنسيق المنطقة الزمنية المطلوب:

clamp

قُدِّم في: v24.5.0 يقيّد قيمة لتبقى ضمن الحدين الأدنى والأقصى المحددين. إذا كانت القيمة أقل من الحد الأدنى، فسيُرجِع الحد الأدنى. وإذا كانت أكبر من الحد الأقصى، فسيُرجِع الحد الأقصى. وإلا فسيُرجِع القيمة نفسها. يجب أن تكون جميع الوسيطات من أنواع قابلة للمقارنة. ويكون نوع النتيجة أكبر نوع متوافق بين جميع الوسيطات. الصيغة
الوسيطات
  • value — القيمة المطلوب تقييدها. - min — الحد الأدنى. - max — الحد الأقصى.
القيمة المُعادة تعيد القيمة بعد تقييدها ضمن النطاق [min, max]. أمثلة الاستخدام الأساسي
Query
Response
القيمة دون الحد الأدنى
Query
Response
القيمة أكبر من الحد الأقصى
Query
Response

greatest

أُضيفت في: v1.1.0 تعيد أكبر قيمة بين الوسيطات. يتم تجاهل الوسيطات NULL.
  • بالنسبة إلى المصفوفات، تعيد المصفوفة الأكبر ترتيبًا معجميًا.
  • بالنسبة إلى أنواع DateTime، تتم ترقية نوع النتيجة إلى أكبر نوع (مثلًا، DateTime64 عند مزجه مع DateTime32).
استخدم الإعداد least_greatest_legacy_null_behavior لتغيير سلوك NULLقدّم الإصدار 24.12 تغييرًا غير متوافق مع الإصدارات السابقة، بحيث يتم تجاهل قيم NULL، بينما كان يُرجِع سابقًا NULL إذا كانت إحدى الوسيطات NULL. للاحتفاظ بالسلوك السابق، اضبط الإعداد least_greatest_legacy_null_behavior (الافتراضي: false) على true.
الصياغة
الوسائط
  • x1[, x2, ...] — قيمة واحدة أو عدة قيم للمقارنة. يجب أن تكون جميع الوسائط من أنواع قابلة للمقارنة. Any
القيمة المعادة تُرجِع أكبر قيمة بين الوسائط، مع ترقيتها إلى أوسع نوع متوافق. Any أمثلة الأنواع الرقمية
Query
Response
المصفوفات
Query
Response
أنواع DateTime
Query
Response

if

أُضيفت في: v1.1.0 تنفّذ التفريع الشرطي.
  • إذا قُيِّم الشرط cond إلى قيمة غير صفرية، فتعيد الدالة نتيجة التعبير then.
  • إذا قُيِّم cond إلى صفر أو NULL، فتُعاد نتيجة التعبير else.
يتحكّم الإعداد short_circuit_function_evaluation في ما إذا كان التقييم المختصر مستخدمًا. إذا كان مفعّلًا، فلا يُقيَّم التعبير then إلا على الصفوف التي تكون فيها قيمة cond هي true، ويُقيَّم التعبير else على الصفوف التي تكون فيها قيمة cond هي false. على سبيل المثال، عند استخدام التقييم المختصر، لا يُطرَح استثناء القسمة على صفر عند تنفيذ الاستعلام التالي:
يجب أن يكون then و else من نوعين متشابهين. الصيغة
الوسائط
  • cond — الشرط الذي يجري تقييمه. UInt8 أو Nullable(UInt8) أو NULL
  • then — التعبير المُعاد إذا كانت cond تساوي true. - else — التعبير المُعاد إذا كانت cond تساوي false أو NULL.
القيمة المُعادة ناتج أحد التعبيرين then أو else، حسب الشرط cond. أمثلة مثال على الاستخدام
Query
Response

least

أُضيف في: v1.1.0 يعيد أصغر قيمة بين الوسائط. يتم تجاهل الوسائط NULL.
  • بالنسبة إلى المصفوفات، يعيد المصفوفة الأصغر ترتيبًا معجميًا.
  • بالنسبة إلى أنواع DateTime، يُرقّى نوع النتيجة إلى أكبر نوع (على سبيل المثال، DateTime64 عند دمجه مع DateTime32).
استخدم الإعداد least_greatest_legacy_null_behavior لتغيير سلوك NULLقدّم الإصدار 24.12 تغييرًا غير متوافق مع الإصدارات السابقة، بحيث يتم تجاهل قيم NULL، بينما كان يعيد سابقًا القيمة NULL إذا كان أحد الوسائط NULL. للاحتفاظ بالسلوك السابق، اضبط الإعداد least_greatest_legacy_null_behavior (القيمة الافتراضية: false) على true.
الصيغة
الوسائط
  • x1[, x2, ...] — قيمة واحدة أو عدة قيم للمقارنة. يجب أن تكون جميع الوسائط من أنواع قابلة للمقارنة. Any
القيمة المُعادة تُعيد أصغر قيمة بين الوسائط، وتُرقّى إلى أكبر نوع متوافق. Any أمثلة الأنواع الرقمية
Query
Response
المصفوفات
Query
Response
أنواع DateTime
Query
Response

multiIf

تم تقديمه في: v1.1.0 يتيح كتابة العامل CASE بصورة أكثر اختصارًا في الاستعلام. يُقيِّم كل شرط بالترتيب. وبالنسبة إلى أول شرط يكون صحيحًا (غير صفري وليس NULL)، يُرجِع قيمة الفرع المقابلة. إذا لم يكن أي من الشروط صحيحًا، فسيُرجِع قيمة else. يتحكم الإعداد short_circuit_function_evaluation في ما إذا كان التقييم المختصر مستخدمًا. وإذا كان مفعّلًا، فلن يُقيَّم التعبير then_i إلا على الصفوف التي تكون فيها ((NOT cond_1) AND ... AND (NOT cond_{i-1}) AND cond_i) صحيحة. على سبيل المثال، مع التقييم المختصر، لا يحدث استثناء قسمة على صفر عند تنفيذ الاستعلام التالي:
يجب أن يكون لجميع تعبيرات الفروع وelse نوع فائق مشترك. تُعامل الشروط ذات القيمة NULL على أنها false. الصيغة
الأسماء البديلة: caseWithoutExpression, caseWithoutExpr الوسائط
  • cond_N — الشرط المُقيَّم رقم N الذي يحدد ما إذا كانت then_N ستُعاد. UInt8 أو Nullable(UInt8) أو NULL
  • then_N — ناتج الدالة عندما تكون cond_N صحيحة. - else — ناتج الدالة إذا لم يتحقق أي من الشروط.
القيمة المعادة تُعيد ناتج then_N الموافق لـ cond_N المطابق، وإلا فتُعيد قيمة else. أمثلة مثال على الاستخدام
Query
Response
آخر تعديل في ٢ يوليو ٢٠٢٦