يا هلا بالجميع! اليوم راح نتكلم عن واحد من أقوى الأدوات في SQL اللي تخليك تتحكم في سير البيانات بشكل شرطي: تعبير CASE. هذا مو بس للمبرمجين، أي حد يتعامل مع بيانات بيحتاجه.
وشو CASE وليش أحتاجه؟
ببساطة، CASE يخليك تنفذ شروط معينة وتطلع قيم مختلفة بناءً عليها. فكر فيها كـ IF/ELSE IF/ELSE لكن داخل استعلام SQL حقك. بدال ما تسحب البيانات بعدين تسوي عليها الشروط ببرنامج ثاني، CASE يخلص لك الشغل من المصدر.
الأساسيات: CASE WHEN THEN END
أبسط استخدام لـ CASE هو تحديد قيمة عمود بناءً على شرط واحد أو أكثر. هذا يسمى Searched CASE expression.
شوف المثال هذا، لو عندنا جدول Products ونبغى نصنف المنتجات حسب سعرها:
SELECT
ProductName,
Price,
CASE
WHEN Price > 100 THEN 'منتج غالي'
WHEN Price > 50 THEN 'منتج متوسط'
ELSE 'منتج رخيص'
END AS ProductCategory
FROM
Products;
هنا، إذا كان السعر أكبر من 100، بيطلع "منتج غالي". إذا لا، بيشوف الشرط اللي بعده (أكبر من 50)، وإذا لا، بيطلع "منتج رخيص" (وهذي قيمة ELSE الافتراضية). لاحظ إن ELSE اختياري، لكن دايماً يفضل تستخدمه عشان ما تطلع لك قيم NULL لبعض الحالات.
الـ CASE المبسط (Simple CASE expression)
فيه نوع ثاني من CASE يسمونه Simple CASE، وهو مفيد لو بتفحص قيمة عمود واحد مقابل قيم ثابتة. أسهل في القراءة لو عندك شروط كثيرة على نفس العمود:
SELECT
OrderStatus,
CASE OrderStatus
WHEN 'Pending' THEN 'الطلب قيد الانتظار'
WHEN 'Shipped' THEN 'تم الشحن'
WHEN 'Delivered' THEN 'تم التوصيل'
ELSE 'حالة غير معروفة'
END AS OrderStatusDescription
FROM
Orders;
هنا، OrderStatus هو العمود اللي بنفحص قيمته. إذا كان 'Pending' بيطلع "الطلب قيد الانتظار" وهكذا. نفس الفكرة، ELSE مهم هنا.
استخدام CASE في ORDER BY (الترتيب الديناميكي)
تقدر تستخدم CASE عشان تخلي ترتيب البيانات ديناميكي. مثلاً، لو تبغى منتجات معينة تطلع في البداية:
SELECT
ProductName,
Price
FROM
Products
ORDER BY
CASE
WHEN ProductName = 'لابتوب' THEN 1 -- اللابتوب أول شيء
WHEN ProductName = 'هاتف ذكي' THEN 2 -- بعده الهاتف الذكي
ELSE 3 -- الباقي بعدهم
END,
Price DESC; -- ثم نرتب بالسعر تنازلي
هنا، اللابتوب بيطلع أول شيء، بعده الهاتف الذكي، ثم باقي المنتجات مرتبة حسب السعر تنازلياً. ركز كيف CASE رجع قيمة رقمية تم استخدامها للترتيب.
CASE مع الدوال التجميعية (GROUP BY و COUNT, SUM)
هنا تطلع قوة CASE الحقيقية في التحليل! تقدر تجمع بيانات بشرط معين.
مثلاً، لو عندك جدول Employees وتبغى تعرف عدد الموظفين الذكور والإناث في نفس الاستعلام:
SELECT
Department,
COUNT(CASE WHEN Gender = 'Male' THEN 1 ELSE NULL END) AS MaleEmployees,
COUNT(CASE WHEN Gender = 'Female' THEN 1 ELSE NULL END) AS FemaleEmployees
FROM
Employees
GROUP BY
Department;
لاحظ هنا: COUNT() يتجاهل قيم NULL. فـ CASE يرجع 1 إذا الشرط تحقق، و NULL إذا لم يتحقق. بالتالي، COUNT بيعد بس اللي حققوا الشرط. نفس الفكرة ممكن تطبقها مع SUM و AVG.
CASE في جمل UPDATE
مو بس SELECT، تقدر تستخدم CASE لتعديل البيانات بشكل شرطي. مثلاً، لو تبغى تزيد رواتب الموظفين في قسم معين:
UPDATE Employees
SET Salary =
CASE
WHEN Department = 'IT' THEN Salary * 1.10 -- زيادة 10% لـ IT
WHEN Department = 'Sales' THEN Salary * 1.05 -- زيادة 5% لـ Sales
ELSE Salary -- الباقي ما يتغير راتبه
END
WHERE
Department IN ('IT', 'Sales'); -- عشان نحدد نطاق التعديل
هنا، الراتب بيتعدل بناءً على القسم. مهم جداً تستخدم WHERE مع UPDATE عشان ما تعدل كل الجدول بالخطأ!
ملاحظات مهمة جداً:
•
CASEهو تعبير (Expression) وليس جملة (Statement). يعني يرجع قيمة واحدة، وتقدر تستخدمه في أي مكان تتوقع فيه قيمة (مثل عمود فيSELECT، شرط فيWHERE، قيمة فيORDER BY، إلخ).• الترتيب يهم: الشروط في
WHENيتم تقييمها بالترتيب. أول شرط يتحقق، قيمته هي اللي ترجع، والباقي يتجاهل. انتبه لو عندك شروط متداخلة!• أنواع البيانات: كل القيم اللي ترجعها
THENأوELSEلازم تكون متوافقة في نوع البيانات. لوTHENيرجع نص وELSEيرجع رقم، ممكن تواجه مشاكل أو تحويلات ضمنية غير متوقعة.• بديل لـ
NULL؟ لو كل اللي تبغاه هو استبدال قيمNULLبقيمة أخرى،COALESCE()ممكن تكون أبسط وأوضح منCASEفي بعض الحالات.
وبكذا نكون غطينا أساسيات واستخدامات CASE المتعددة. طبقوها وبتشوفون كيف بتسهل عليكم شغل كثير في SQL!