CASE البسيط مقابل CASE البحث
طريقتان لكتابة CASE
CASE البسيط مقابل CASE البحث درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.
طريقتان لكتابة CASE
يوفر SQL صيغتين لتعبير CASE: CASE البسيط وCASE المُبحَث عنه. يُرجع كلاهما قيمةً بناءً على الشروط، لكنهما يختلفان في طريقة كتابة هذه الشروط.
بنهاية هذا الدرس، ستعرفون متى تستخدمون كل صيغة وكيف تتجنبون الأخطاء الشائعة الناتجة عن الخلط بينهما.
CASE البسيط — الفكرة
يقارن CASE البسيط تعبيرًا واحدًا بقائمة من القيم. فكّروا فيه كأنه جدول بحث: تختارون عمودًا أو قيمة واحدة على اليسار، ثم تدرجون القيمة التي تساويها في كل فرع من فروع WHEN.
الصيغة: CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 ELSE default END
SELECT
product_name,
category_id,
CASE category_id
WHEN 1 THEN 'Electronics'
WHEN 2 THEN 'Clothing'
WHEN 3 THEN 'Books'
ELSE 'Other'
END AS category_name
FROM products;CASE البسيط عمليًا
يوضع تعبير CASE هنا مباشرةً بعد الكلمة المفتاحية، ويُقارَن العمود status بكل قيمة من قيم WHEN باستخدام المساواة. لاحظوا أنكم لا تكتبون status = في فروع WHEN، إذ إن المقارنة مفهومة ضمنيًا.
SELECT
order_id,
status,
CASE status
WHEN 'pending' THEN 'Awaiting payment'
WHEN 'paid' THEN 'Payment received'
WHEN 'shipped' THEN 'On its way'
WHEN 'delivered' THEN 'Completed'
ELSE 'Unknown status'
END AS status_label
FROM orders;CASE المُبحَث عنه — الفكرة
لا يحتوي CASE المُبحَث عنه على تعبير مباشرةً بعد الكلمة المفتاحية CASE. بدلًا من ذلك، يحتوي كل فرع من فروع WHEN على شرط منطقي كامل. وهذا يجعله أكثر مرونة بكثير؛ إذ يمكنكم المزج بين أعمدة مختلفة، واستخدام عمليات التحقق من النطاقات، أو استدعاء الدوال داخل كل WHEN.
الصيغة: CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ELSE default END
SELECT
employee_name,
salary,
CASE
WHEN salary < 30000 THEN 'Entry Level'
WHEN salary < 60000 THEN 'Mid Level'
WHEN salary < 100000 THEN 'Senior'
ELSE 'Executive'
END AS salary_band
FROM employees;CASE المُبحَث عنه عمليًا
بما أن كل WHEN يقبل أي تعبير منطقي، يمكنكم دمج عدة أعمدة في فرع واحد. تقيّم قاعدة البيانات عبارات WHEN من الأعلى إلى الأسفل، وتُرجع نتيجة أول فرع تكون قيمته TRUE.
SELECT
product_name,
stock,
price,
CASE
WHEN stock = 0 THEN 'Out of stock'
WHEN stock < 10 AND price > 100 THEN 'Low stock — premium item'
WHEN stock < 10 THEN 'Low stock'
ELSE 'In stock'
END AS availability
FROM products;الفرق البنيوي الأساسي
يلخّص الجدول أدناه الفرق الأساسي:
CASE البسيط — تعبير واحد بعد CASE، ويتحقق كل WHEN من المساواة مع ذلك التعبير.
CASE المُبحَث عنه — لا يوجد تعبير بعد CASE، وكل WHEN شرط منطقي مستقل.
لأن CASE البسيط لا ينفذ إلا عمليات تحقق من المساواة، فهو لا يتعامل مع النطاقات أو قيم NULL أو الشروط التي تشمل عدة أعمدة. ولأي شيء يتجاوز مطابقة قيمة مباشرة، استخدموا CASE المُبحَث عنه.
-- Simple CASE: equality only
SELECT CASE day_number
WHEN 1 THEN 'Monday'
WHEN 2 THEN 'Tuesday'
ELSE 'Other'
END AS day_name
FROM schedule;
-- Searched CASE: any condition
SELECT CASE
WHEN day_number BETWEEN 1 AND 5 THEN 'Weekday'
WHEN day_number IN (6, 7) THEN 'Weekend'
END AS day_type
FROM schedule;معالجة NULL — لماذا يتفوق CASE المُبحَث عنه
يستخدم CASE البسيط المعامل = داخليًا، ولا تكون NULL = NULL صحيحةً أبدًا في SQL. لذلك لا يستطيع CASE البسيط مطابقة عمود قيمته NULL. أما CASE المُبحَث عنه، فيتيح لكم كتابة WHEN column IS NULL THEN ...، وهي صيغة تعمل بشكل صحيح.
-- Simple CASE: NULL branch never matches
SELECT CASE manager_id
WHEN NULL THEN 'No manager' -- this will NEVER fire
ELSE 'Has manager'
END
FROM employees;
-- Searched CASE: correct NULL check
SELECT CASE
WHEN manager_id IS NULL THEN 'No manager'
ELSE 'Has manager'
END AS manager_status
FROM employees;دمج الأعمدة في CASE المُبحَث عنه
من أبرز مزايا CASE المُبحَث عنه أن كل فرع من فروع WHEN يمكنه الإشارة إلى أعمدة مختلفة تمامًا أو استدعاء دوال. ويتيح لكم ذلك التعبير عن قواعد عمل معقدة لا يستطيع CASE البسيط التعامل معها إطلاقًا.
SELECT
customer_name,
total_orders,
total_spent,
CASE
WHEN total_spent > 10000 AND total_orders > 20 THEN 'VIP'
WHEN total_spent > 5000 THEN 'Gold'
WHEN total_orders > 10 THEN 'Silver'
ELSE 'Standard'
END AS tier
FROM customers;استخدام CASE في ORDER BY
يمكن أن تظهر كلتا صيغتي CASE داخل ORDER BY لإنشاء ترتيب مخصص لا وجود له في البيانات. يربط CASE البسيط هنا أسماء الأولوية بأرقام، بحيث تُرتب الصفوف وفق أولوية العمل بدلًا من ترتيبها أبجديًا.
SELECT ticket_id, subject, priority
FROM support_tickets
ORDER BY
CASE priority
WHEN 'critical' THEN 1
WHEN 'high' THEN 2
WHEN 'medium' THEN 3
WHEN 'low' THEN 4
ELSE 5
END ASC;CASE داخل الدوال التجميعية
يُعد وضع CASE المُبحَث عنه داخل SUM أو COUNT نمطًا شائعًا للتجميع الشرطي، ويُسمّى أحيانًا pivot. ويتيح لكم إنتاج إجماليات عدة فئات في عملية قراءة واحدة بدلًا من تشغيل عدة استعلامات.
SELECT
department,
COUNT(*) AS total_employees,
SUM(CASE WHEN gender = 'F' THEN 1 ELSE 0 END) AS female_count,
SUM(CASE WHEN gender = 'M' THEN 1 ELSE 0 END) AS male_count,
SUM(CASE WHEN salary > 70000 THEN salary ELSE 0 END) AS high_earner_payroll
FROM employees
GROUP BY department;اختيار الصيغة المناسبة
إليكم قاعدة عملية بسيطة:
استخدموا CASE البسيط عندما تربطون عمودًا واحدًا بمجموعة ثابتة من القيم المعروفة؛ فهو أقصر وأسهل قراءة.
استخدموا CASE المُبحَث عنه في جميع الحالات الأخرى: النطاقات، والتحقق من NULL، والمنطق الذي يشمل عدة أعمدة، أو استدعاء الدوال داخل الشروط.
عند الشك، يعمل CASE المُبحَث عنه دائمًا. ويمكنكم حتى إعادة كتابة أي CASE بسيط على هيئة CASE مُبحَث عنه، لكن العكس غير ممكن.
-- These two queries return identical results
-- Simple CASE (concise for equality)
SELECT CASE region_code
WHEN 'US' THEN 'United States'
WHEN 'UK' THEN 'United Kingdom'
ELSE 'International'
END AS region_name
FROM sales;
-- Equivalent Searched CASE
SELECT CASE
WHEN region_code = 'US' THEN 'United States'
WHEN region_code = 'UK' THEN 'United Kingdom'
ELSE 'International'
END AS region_name
FROM sales;اختبار سريع
اختبروا مدى فهمكم للفرق بين CASE البسيط وCASE المُبحَث عنه.
مراجعة الدرس
إليكم ما تعلمتموه في هذا الدرس:
CASE البسيط — ضعوا تعبيرًا واحدًا بعد CASE؛ ويتحقق كل WHEN مما إذا كان ذلك التعبير يساوي قيمةً محددة. وهو الأنسب لربط عمود واحد بقائمة ثابتة من التسميات.
CASE المُبحَث عنه — لا يوجد تعبير بعد CASE؛ ويحتوي كل WHEN على شرط منطقي كامل. وهو يدعم النطاقات، والتحقق من NULL، والمنطق الذي يشمل عدة أعمدة، واستدعاء الدوال.
تقيّم كلتا الصيغتين الفروع من الأعلى إلى الأسفل، وتُرجعان نتيجة أول فرع تكون قيمته TRUE. عندما لا يتطابق أي فرع ولا توجد عبارة ELSE، تكون النتيجة NULL. وللحصول على أقصى قدر من المرونة، يُعد CASE المُبحَث عنه دائمًا الخيار الآمن؛ إذ يمكنه تنفيذ كل ما ينفذه CASE البسيط وأكثر.
الأسئلة الشائعة
هل درس «CASE البسيط مقابل CASE البحث» مجاني؟
نعم — نص درس «CASE البسيط مقابل CASE البحث» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.
ماذا ستتعلم في «CASE البسيط مقابل CASE البحث»؟
طريقتان لكتابة CASE تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟
لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «CASE البسيط مقابل CASE البحث»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟
نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تعبير CASE
- CASE البسيط مقابل CASE البحث
- تجميع البيانات وتسميتها
- CASE في ORDER BY والتجميعات