كيفية استخدام تعابير 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. هي أداة قوية جداً بتخليك تكتب استعلامات أكثر ذكاءً ومرونة. جربها في مشاريعك وشوف كيف بتسهل عليك الشغل!