الـ IF() والـ CASE WHEN THEN هما أدوات مهمة في MySQL لو عايز تاخد قرارات أو تصنف البيانات في الاستعلامات بتاعتك. تعال نشرحهم بطريقة بسيطة وبالعامية.


IF() في MySQL

إيه هي؟

الـ IF() بتشتغل زي الـ IF اللي في Excel. بتديك اختيارين:

  • قيمة لو الشرط True.
  • وقيمة تانية لو الشرط False.

الصيغة:

IF(condition, value_if_true, value_if_false)

أمثلة:

  1. اختبار شرط بسيط:
SELECT 
    IF(500 < 1000, 'YES', 'NO') AS result;
  • هنا لو 500 أقل من 1000، هيطلع YES. غير كده هيطلع NO.

  1. تصنيف بيانات بناءً على شرط: لو عندك جدول اسمه stocks وفيه عمود spy (بيرمز لحركة أسعار الأسهم)، وعايز تعرف لو السعر موجب ولا سالب:
SELECT 
    spy,
    IF(spy >= 0, 1, -1) AS returns
FROM data;
  • النتيجة: لو السعر أكبر أو يساوي 0 هيطلع 1، ولو أقل من 0 هيطلع -1.

  1. عرض نص بدل رقم:
SELECT 
    symbol,
    IF(Quantity >= 0, 'UP', 'DOWN') AS direction
FROM data;
  • UP لو الكمية موجبة، وDOWN لو الكمية سالبة.

  1. استخدام IF() مع Aggregation: لو عايز تجمع القيم اللي تحقق شرط معين:
SELECT 
    IF(Quantity > 10, AVG(Price), 0) AS avg_price_above_10
FROM data
GROUP BY direction;
  • هنا بيحسب متوسط الأسعار لما الكمية أكبر من 10.

CASE WHEN THEN في MySQL

إيه هي؟

الـ CASE بتديك حرية أكتر لأنها بتدعم شروط متعددة. يعني بدل ما تشتغل على شرط واحد زي IF()، تقدر تضيف أكتر من شرط.

الصيغة:

CASE 
    WHEN condition1 THEN value1
    WHEN condition2 THEN value2
    ...
    ELSE default_value
END

أمثلة:

  1. تحويل أرقام لأيام: لو عندك جدول فيه تواريخ (مثلاً عمود trade_date)، وعايز تحوّل الأيام اللي متخزنة كأرقام (0=Monday) إلى أسماء:
SELECT 
    trade_date,
    CASE 
        WHEN WEEKDAY(trade_date) = 0 THEN 'Monday'
        WHEN WEEKDAY(trade_date) = 1 THEN 'Tuesday'
        WHEN WEEKDAY(trade_date) = 2 THEN 'Wednesday'
        WHEN WEEKDAY(trade_date) = 3 THEN 'Thursday'
        WHEN WEEKDAY(trade_date) = 4 THEN 'Friday'
        ELSE 'Weekend'
    END AS weekday_name
FROM data;
  • النتيجة: كل تاريخ هيبقى مرتبط باسم اليوم بتاعه.

  1. تصنيف البيانات: لو عايز تعرف حركة الأسعار (موجبة أو سالبة):
SELECT 
    CASE 
        WHEN returns >= 0 THEN 'Positive'
        ELSE 'Negative'
    END AS return_status,
    AVG(returns) AS avg_return
FROM data
GROUP BY return_status;
  • بيجمع البيانات على حسب حركة السعر (Positive أو Negative) ويحسب المتوسط لكل مجموعة.

  1. الترتيب حسب أيام الأسبوع: لو عايز ترتب الأيام حسب الترتيب الطبيعي (Monday - Friday):
SELECT 
    WEEKDAY(trade_date) AS weekday_number,
    CASE 
        WHEN WEEKDAY(trade_date) = 0 THEN 'Monday'
        WHEN WEEKDAY(trade_date) = 1 THEN 'Tuesday'
        WHEN WEEKDAY(trade_date) = 2 THEN 'Wednesday'
        WHEN WEEKDAY(trade_date) = 3 THEN 'Thursday'
        WHEN WEEKDAY(trade_date) = 4 THEN 'Friday'
        ELSE 'Weekend'
    END AS weekday_name,
    AVG(returns) AS avg_return
FROM data
GROUP BY WEEKDAY(trade_date), weekday_name
ORDER BY WEEKDAY(trade_date);
  • هنا بيرتب البيانات حسب رقم اليوم (Monday = 0، Tuesday = 1).

الفرق بين IF() و CASE WHEN THEN

الميزةIF()CASE WHEN THEN
بساطة الاستخدامأسهل في الحالات البسيطةأفضل للحالات المعقدة
عدد الشروطشرط واحدتدعم شروط متعددة
سهولة القراءةممكن تكون صعبة مع التداخلأسهل مع الشروط المتعددة
الاستخداماتأفضل لو عندك مقارنة واحدةمثالية للتصنيفات أو المنطق المعقد

خلاصة:

  • استخدم IF() لما تكون عايز حاجة بسيطة وسريعة.
  • استخدم CASE WHEN THEN لما تحتاج شروط أكتر أو منطق معقد.
  • الاتنين أدوات قوية جدًا لتصنيف البيانات أو اتخاذ قرارات جوه الاستعلامات.