الانتقال إلى المحتوى الرئيسي
تتيح لك عبارة WHERE تصفية البيانات القادمة من عبارة FROM في SELECT. إذا وُجدت عبارة WHERE، فيجب أن تليها تعبير من النوع UInt8. وتُستبعَد الصفوف التي تُقيَّم فيها هذه التعبير إلى 0 من المعالجات اللاحقة أو من النتيجة. غالبًا ما تُستخدم تعبير التي تلي عبارة WHERE مع عوامل المقارنة والعوامل المنطقية، أو مع إحدى الدوال العادية العديدة. تُقيَّم تعبير الخاصة بـ WHERE من حيث إمكانية استخدام الفهارس وpartition pruning، إذا كان table engine الخاص بـ underlying table يدعم ذلك.
PREWHEREتوجد أيضًا آلية تحسين للتصفية تُسمى PREWHERE. ‏Prewhere هو تحسين يتيح تطبيق التصفية بكفاءة أعلى. وهو مفعّل افتراضيًا حتى إذا لم تُحدَّد عبارة PREWHERE صراحةً.

التحقق من NULL

إذا كنت بحاجة إلى التحقق مما إذا كانت قيمة هي NULL، فاستخدم: وإلا فلن يطابق أي تعبير يحتوي على NULL أي شرط مطلقًا.

تصفية البيانات باستخدام العوامل المنطقية

يمكنك استخدام الدوال المنطقية التالية مع عبارة WHERE لدمج عدة شروط:

استخدام أعمدة UInt8 كشرط

في ClickHouse، يمكن استخدام أعمدة UInt8 مباشرةً كشروط منطقية، بحيث تمثّل 0 القيمة false وتمثّل أي قيمة غير صفرية (وغالبًا 1) القيمة true. ويَرِد مثال على ذلك في القسم أدناه.

استخدام معاملات المقارنة

يمكن استخدام معاملات المقارنة التالية:
المعاملالدالةالوصفمثال
a = bequals(a, b)يساويprice = 100
a == bequals(a, b)يساوي (صيغة بديلة)price == 100
a != bnotEquals(a, b)لا يساويcategory != 'Electronics'
a <> bnotEquals(a, b)لا يساوي (صيغة بديلة)category <> 'Electronics'
a < bless(a, b)أقل منprice < 200
a <= blessOrEquals(a, b)أقل من أو يساويprice <= 200
a > bgreater(a, b)أكبر منprice > 500
a >= bgreaterOrEquals(a, b)أكبر من أو يساويprice >= 500
a LIKE slike(a, b)مطابقة النمط (حساسة لحالة الأحرف)name LIKE '%top%'
a NOT LIKE snotLike(a, b)عدم مطابقة النمط (حساسة لحالة الأحرف)name NOT LIKE '%top%'
a ILIKE silike(a, b)مطابقة النمط (غير حساسة لحالة الأحرف)name ILIKE '%LAPTOP%'
a BETWEEN b AND ca >= b AND a <= cالتحقق من النطاق (شامل)price BETWEEN 100 AND 500
a NOT BETWEEN b AND ca < b OR a > cالتحقق من الخروج عن النطاقprice NOT BETWEEN 100 AND 500

مطابقة الأنماط والتعبيرات الشرطية

إلى جانب معاملات المقارنة، يمكنك استخدام مطابقة الأنماط والتعبيرات الشرطية في عبارة WHERE.
الميزةالصياغةمراعي لحالة الأحرفالأداءالأفضل لـ
LIKEcol LIKE '%pattern%'نعمسريعمطابقة الأنماط مع تمييز حالة الأحرف
ILIKEcol ILIKE '%pattern%'لاأبطأالبحث دون تمييز حالة الأحرف
if()if(cond, a, b)لا ينطبقسريعالشروط الثنائية البسيطة
multiIf()multiIf(c1, r1, c2, r2, def)لا ينطبقسريعالشروط المتعددة
CASECASE WHEN ... THEN ... ENDلا ينطبقسريعمنطق شرطي قياسي في SQL
راجع “مطابقة الأنماط والتعبيرات الشرطية” للاطلاع على أمثلة الاستخدام.

تعبير يتضمن قيماً حرفية أو أعمدة أو استعلامات فرعية

يمكن أن يتضمن التعبير الذي يلي عبارة WHERE أيضاً قيماً حرفية، أو أعمدة، أو استعلامات فرعية، وهي عبارات SELECT متداخلة تُرجِع قيماً تُستخدم في الشروط.
النوعالتعريفالتقييمالأداءالمثال
قيمة حرفيةقيمة ثابتةعند كتابة الاستعلامالأسرعWHERE price > 100
عمودمرجع إلى بيانات الجدوللكل صفسريعWHERE price > cost
استعلام فرعيعبارة SELECT متداخلةوقت تنفيذ الاستعلاميختلفWHERE id IN (SELECT ...)
يمكنك المزج بين القيم الحرفية والأعمدة والاستعلامات الفرعية في الشروط المعقدة:
-- Literal + Column
WHERE price > 100 AND category = 'Electronics'

-- Column + Subquery
WHERE price > (SELECT AVG(price) FROM products) AND in_stock = true

-- Literal + Column + Subquery
WHERE category = 'Electronics' 
  AND price < 500
  AND id IN (SELECT product_id FROM bestsellers)

-- All three with logical operators
WHERE (price > 100 OR category IN (SELECT category FROM featured))
  AND in_stock = true
  AND name LIKE '%Special%'

أمثلة

التحقق من NULL

الاستعلامات التي تتضمن قيماً من نوع NULL:
CREATE TABLE t_null(x Int8, y Nullable(Int8)) ENGINE=MergeTree() ORDER BY x;
INSERT INTO t_null VALUES (1, NULL), (2, 3);

SELECT * FROM t_null WHERE y IS NULL;
SELECT * FROM t_null WHERE y != 0;
┌─x─┬────y─┐
│ 1 │ ᴺᵁᴸᴸ │
└───┴──────┘
┌─x─┬─y─┐
│ 2 │ 3 │
└───┴───┘

تصفية البيانات باستخدام العوامل المنطقية

بالنظر إلى الجدول والبيانات التاليين:
CREATE TABLE products (
    id UInt32,
    name String,
    price Float32,
    category String,
    in_stock Bool
) ENGINE = MergeTree()
ORDER BY id;

INSERT INTO products VALUES
(1, 'Laptop', 999.99, 'Electronics', true),
(2, 'Mouse', 25.50, 'Electronics', true),
(3, 'Desk', 299.00, 'Furniture', false),
(4, 'Chair', 150.00, 'Furniture', true),
(5, 'Monitor', 350.00, 'Electronics', true),
(6, 'Lamp', 45.00, 'Furniture', false);
1. AND - يجب أن يكون كلا الشرطين true:
SELECT * FROM products
WHERE category = 'Electronics' AND price < 500;
   ┌─id─┬─name────┬─price─┬─category────┬─in_stock─┐
1. │  2 │ Mouse   │  25.5 │ Electronics │ true     │
2. │  5 │ Monitor │   350 │ Electronics │ true     │
   └────┴─────────┴───────┴─────────────┴──────────┘
2. OR - يجب أن يتحقق شرط واحد على الأقل:
SELECT * FROM products
WHERE category = 'Furniture' OR price > 500;
   ┌─id─┬─name───┬──price─┬─category────┬─in_stock─┐
1. │  1 │ Laptop │ 999.99 │ Electronics │ true     │
2. │  3 │ Desk   │    299 │ Furniture   │ false    │
3. │  4 │ Chair  │    150 │ Furniture   │ true     │
4. │  6 │ Lamp   │     45 │ Furniture   │ false    │
   └────┴────────┴────────┴─────────────┴──────────┘
3. NOT - ينفي شرطًا:
SELECT * FROM products
WHERE NOT in_stock;
   ┌─id─┬─name─┬─price─┬─category──┬─in_stock─┐
1. │  3 │ Desk │   299 │ Furniture │ false    │
2. │  6 │ Lamp │    45 │ Furniture │ false    │
   └────┴──────┴───────┴───────────┴──────────┘
4. XOR - يجب أن يتحقق شرط واحد فقط (وليس كلاهما):
SELECT *
FROM products
WHERE xor(price > 200, category = 'Electronics')
   ┌─id─┬─name──┬─price─┬─category────┬─in_stock─┐
1. │  2 │ Mouse │  25.5 │ Electronics │ true     │
2. │  3 │ Desk  │   299 │ Furniture   │ false    │
   └────┴───────┴───────┴─────────────┴──────────┘
5. دمج عدة عوامل:
SELECT * FROM products
WHERE (category = 'Electronics' OR category = 'Furniture')
  AND in_stock = true
  AND price < 400;
   ┌─id─┬─name────┬─price─┬─category────┬─in_stock─┐
1. │  2 │ Mouse   │  25.5 │ Electronics │ true     │
2. │  4 │ Chair   │   150 │ Furniture   │ true     │
3. │  5 │ Monitor │   350 │ Electronics │ true     │
   └────┴─────────┴───────┴─────────────┴──────────┘
6. استخدام صيغة الدوال:
SELECT * FROM products
WHERE and(or(category = 'Electronics', price > 100), in_stock);
   ┌─id─┬─name────┬──price─┬─category────┬─in_stock─┐
1. │  1 │ Laptop  │ 999.99 │ Electronics │ true     │
2. │  2 │ Mouse   │   25.5 │ Electronics │ true     │
3. │  4 │ Chair   │    150 │ Furniture   │ true     │
4. │  5 │ Monitor │    350 │ Electronics │ true     │
   └────┴─────────┴────────┴─────────────┴──────────┘
تكون صيغة الكلمات المفتاحية في SQL (AND, OR, NOT, XOR) أوضح للقراءة عمومًا، لكن صيغة الدوال قد تكون مفيدة في التعبيرات المعقدة أو عند إنشاء استعلامات ديناميكية.

استخدام أعمدة UInt8 كشرط

انطلاقًا من الجدول الوارد في مثال سابق، يمكنك استخدام اسم العمود مباشرةً كشرط:
SELECT * FROM products
WHERE in_stock
   ┌─id─┬─name────┬──price─┬─category────┬─in_stock─┐
1. │  1 │ Laptop  │ 999.99 │ Electronics │ true     │
2. │  2 │ Mouse   │   25.5 │ Electronics │ true     │
3. │  4 │ Chair   │    150 │ Furniture   │ true     │
4. │  5 │ Monitor │    350 │ Electronics │ true     │
   └────┴─────────┴────────┴─────────────┴──────────┘

استخدام معاملات المقارنة

تستخدم الأمثلة أدناه الجدول والبيانات من المثال أعلاه. حُذفت النتائج للإيجاز. 1. المساواة الصريحة مع true (= 1 أو = true):
SELECT * FROM products
WHERE in_stock = true;
-- or
WHERE in_stock = 1;
2. المساواة الصريحة بـ false (= 0 أو = false):
SELECT * FROM products
WHERE in_stock = false;
-- or
WHERE in_stock = 0;
3. عدم التساوي (!= 0 أو != false):
SELECT * FROM products
WHERE in_stock != false;
-- or
WHERE in_stock != 0;
4. أكبر من:
SELECT * FROM products
WHERE in_stock > 0;
5. أصغر من أو يساوي:
SELECT * FROM products
WHERE in_stock <= 0;
6. الجمع بين شروط أخرى:
SELECT * FROM products
WHERE in_stock AND price < 400;
7. استخدام المعامل IN: في المثال أدناه، تمثّل (1, true) قيمة من النوع Tuple.
SELECT * FROM products
WHERE in_stock IN (1, true);
يمكنك أيضًا استخدام مصفوفة لتحقيق ذلك:
SELECT * FROM products
WHERE in_stock IN [1, true];
8. الخلط بين أساليب المقارنة:
SELECT * FROM products
WHERE category = 'Electronics' AND in_stock = true;

مطابقة الأنماط والتعبيرات الشرطية

تستخدم الأمثلة أدناه الجدول والبيانات الواردين في المثال أعلاه. وحُذفت النتائج للاختصار.

أمثلة على LIKE

-- Find products with 'o' in the name
SELECT * FROM products WHERE name LIKE '%o%';
-- Result: Laptop, Monitor

-- Find products starting with 'L'
SELECT * FROM products WHERE name LIKE 'L%';
-- Result: Laptop, Lamp

-- Find products with exactly 4 characters
SELECT * FROM products WHERE name LIKE '____';
-- Result: Desk, Lamp

أمثلة على ILIKE

-- Case-insensitive search for 'LAPTOP'
SELECT * FROM products WHERE name ILIKE '%laptop%';
-- Result: Laptop

-- Case-insensitive prefix match
SELECT * FROM products WHERE name ILIKE 'l%';
-- Result: Laptop, Lamp

أمثلة على IF

-- Different price thresholds by category
SELECT * FROM products
WHERE if(category = 'Electronics', price < 500, price < 200);
-- Result: Mouse, Chair, Monitor
-- (Electronics under $500 OR Furniture under $200)

-- Filter based on stock status
SELECT * FROM products
WHERE if(in_stock, price > 100, true);
-- Result: Laptop, Chair, Monitor, Desk, Lamp
-- (In stock items over $100 OR all out-of-stock items)

أمثلة على multiIf

-- Multiple category-based conditions
SELECT * FROM products
WHERE multiIf(
    category = 'Electronics', price < 600,
    category = 'Furniture', in_stock = true,
    false
);
-- Result: Mouse, Monitor, Chair
-- (Electronics < $600 OR in-stock Furniture)

-- Tiered filtering
SELECT * FROM products
WHERE multiIf(
    price > 500, category = 'Electronics',
    price > 100, in_stock = true,
    true
);
-- Result: Laptop, Chair, Monitor, Lamp

أمثلة على CASE

صيغة CASE البسيطة:
-- Different rules per category
SELECT * FROM products
WHERE CASE category
    WHEN 'Electronics' THEN price < 400
    WHEN 'Furniture' THEN in_stock = true
    ELSE false
END;
-- Result: Mouse, Monitor, Chair
CASE الشرطي:
-- Price-based tiered logic
SELECT * FROM products
WHERE CASE
    WHEN price > 500 THEN in_stock = true
    WHEN price > 100 THEN category = 'Electronics'
    ELSE true
END;
-- Result: Laptop, Monitor, Mouse, Lamp
آخر تعديل في ٢٥ يونيو ٢٠٢٦