كيفية استخدام تعابير CASE في لغة الاستعلام البنيوية SQL


كيفية استخدام تعابير CASE في لغة الاستعلام البنيوية SQL

يا هلا! اليوم بنتكلم عن أداة قوية ومرنة جداً في SQL اسمها CASE. لو كنت تبغى تخلي استعلاماتك أكثر ذكاءً وتجاوباً مع شروط معينة، فهذا الدرس لك. ببساطة، CASE يخليك تنفّذ منطق "إذا كان كذا، سوي كذا، وإلا سوي كذا".

الأساسيات: كيف تعمل جملة CASE؟

هذا هو الهيكل الأساسي لـ CASE:

CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    ELSE result_else
END
  • CASE و END: تحدد بداية ونهاية تعبير CASE.
  • WHEN condition THEN result: لو تحقق الشرط (condition)، حط القيمة (result). تقدر تحط أكثر من WHEN.
  • ELSE result_else: لو ما تحقق ولا شرط من اللي قبلها، حط القيمة اللي هنا. ELSE اختياري، لكن يفضل استخدامه لتجنب قيم NULL غير المتوقعة.

مثال 1: تصنيف البيانات في SELECT

تخيل عندك جدول للمنتجات وتبغى تصنفها حسب سعرها (غالي، متوسط، رخيص). هنا يجي دور CASE في جملة SELECT عشان يسوي عمود جديد بناءً على منطق معين:

SELECT
    ProductName,
    Price,
    CASE
        WHEN Price > 100 THEN 'منتج غالي'
        WHEN Price BETWEEN 50 AND 100 THEN 'منتج متوسط'
        ELSE 'منتج رخيص'
    END AS PriceCategory
FROM
    Products;

ملاحظة: جملة CASE ترجع قيمة واحدة فقط لكل صف. أول WHEN يتحقق، هي اللي تُستخدم وتتجاهل البقية.

مثال 2: استخدام CASE في ORDER BY (الترتيب الشرطي)

أحياناً تحتاج ترتب بياناتك بطريقة غير تقليدية. مثلاً، عندك موظفين وتبغى ترتب المدراء أول شيء، بعدين الباقي أبجدياً:

SELECT
    EmployeeName,
    JobTitle
FROM
    Employees
ORDER BY
    CASE
        WHEN JobTitle = 'Manager' THEN 1
        ELSE 2
    END,
    EmployeeName;

هنا، المدراء بيحصلون على القيمة 1، والباقي 2. لما ترتب، الـ 1 بيجي قبل الـ 2، فبيترتب المدراء أول شيء. وبعدين، داخل كل مجموعة (المدراء، وغير المدراء)، بيتم الترتيب حسب EmployeeName.

مثال 3: CASE في جملة WHERE (تصفية معقدة)

يمكنك استخدام CASE لإنشاء شروط تصفية أكثر تعقيداً في جملة WHERE. هذا نادر شوي، لأنه غالباً تقدر تستخدم AND و OR، لكن ممكن يكون مفيد في بعض الحالات:

SELECT
    OrderID,
    OrderDate,
    TotalAmount
FROM
    Orders
WHERE
    CASE
        WHEN OrderDate < '2023-01-01' THEN TotalAmount > 500
        ELSE TotalAmount > 1000
    END;

هذا الاستعلام بيجيب الطلبات اللي قبل عام 2023 وكان مجموعها أكثر من 500، والطلبات اللي بعد عام 2023 وكان مجموعها أكثر من 1000.

مثال 4: CASE مع دوال التجميع (Aggregate Functions)

هنا CASE يبرز قوته الحقيقية! تقدر تستخدمه داخل دوال التجميع مثل SUM, COUNT, AVG عشان تحسب أشياء بناءً على شروط معينة. مثلاً، كم عدد الطلبات المكتملة مقابل الطلبات المعلقة:

SELECT
    COUNT(CASE WHEN OrderStatus = 'Completed' THEN 1 ELSE NULL END) AS CompletedOrders,
    COUNT(CASE WHEN OrderStatus = 'Pending' THEN 1 ELSE NULL END) AS PendingOrders,
    SUM(CASE WHEN OrderStatus = 'Completed' THEN TotalAmount ELSE 0 END) AS TotalCompletedAmount
FROM
    Orders;

نصيحة: لما تستخدم COUNT مع CASE، استخدم ELSE NULL بدل ELSE 0، لأن COUNT تتجاهل قيم NULL لكنها تحسب الصفر. في SUM، استخدم ELSE 0 عشان ما يؤثر على المجموع.

CASE البسيط (Simple CASE) مقابل CASE البحثي (Searched CASE)

كل الأمثلة اللي فوق كانت من نوع "Searched CASE" (البحثي)، لأنه يسمح لك بتحط شروط مختلفة لكل WHEN. لكن فيه نوع ثاني اسمه "Simple CASE" (البسيط) يستخدم للمقارنة بقيمة واحدة:

Simple CASE:

CASE column_name
    WHEN value1 THEN result1
    WHEN value2 THEN result2
    ELSE result_else
END

مثال على Simple CASE:

SELECT
    ProductName,
    Category,
    CASE Category
        WHEN 'Electronics' THEN 'إلكترونيات'
        WHEN 'Books' THEN 'كتب'
        WHEN 'Home & Kitchen' THEN 'منزل ومطبخ'
        ELSE 'أخرى'
    END AS LocalizedCategory
FROM
    Products;

الاثنين يؤدون نفس الغرض في كثير من الأحيان، لكن الـ "Searched CASE" أكثر مرونة لأنه يسمح بشروط معقدة لكل WHEN.

نقاط مهمة لازم تتذكرها عن CASE:

  • الترتيب يهم: جمل WHEN تُقيّم بالترتيب. أول شرط يتحقق، هو اللي يُستخدم.
  • نوع البيانات: كل النتائج (result1, result2, result_else) لازم تكون من نفس نوع البيانات أو قابلة للتحويل لنوع بيانات واحد.
  • ELSE اختياري لكن موصى به: لو ما استخدمت ELSE وما تحقق أي شرط، القيمة اللي بترجع بتكون NULL.
  • كل جملة CASE لازم تنتهي بـ END.

وبكذا، نكون غطينا أساسيات استخدام CASE في SQL. هي أداة قوية جداً بتخليك تكتب استعلامات أكثر ذكاءً ومرونة. جربها في مشاريعك وشوف كيف بتسهل عليك الشغل!