تعبير CASE
منطق IF/THEN داخل الاستعلام
تعبير CASE درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.
المنطق الشرطي في SQL
تحتاج أحيانًا إلى أن يتخذ الاستعلام قرارًا: إذا تحقق هذا، فافعل ذلك، وإلا فافعل شيئًا آخر. توفر SQL تعبير CASE لهذا الغرض تحديدًا.
يتيح لك CASE إرجاع قيم مختلفة بناءً على الشروط، مباشرةً داخل SELECT. فكّر فيه على أنه سلسلة if/else في SQL.
SELECT name,
CASE WHEN price > 100 THEN 'expensive'
ELSE 'affordable'
END AS price_band
FROM products;بنية CASE
يتكوّن تعبير CASE من بضعة أجزاء:
WHEN condition THEN value— فرع واحد أو أكثرELSE value— قيمة بديلة اختياريةEND— يغلق التعبير، وهو مطلوب!
تقيّم SQL فروع WHEN من الأعلى إلى الأسفل، وتُرجع قيمة أول فرع يكون صحيحًا.
CASE WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE default_result
ENDتعيد CASE قيمة
الفكرة الأساسية هي أن تعبير CASE يُقيّم إلى قيمة واحدة لكل صف. وبما أنه ينتج قيمة، يمكنك استخدامه في أي موضع يُسمح فيه باستخدام قيمة، مثل قائمة SELECT وWHERE وORDER BY، وحتى داخل الدوال.
في هذه الحالة، يضع تسمية بسيطة لحالة كل طلب.
SELECT order_id,
CASE WHEN shipped_at IS NOT NULL THEN 'shipped'
WHEN paid_at IS NOT NULL THEN 'paid'
ELSE 'pending'
END AS status
FROM orders;يفوز أول تطابق
ترتيب الفروع مهم. تتحقق SQL من كل WHEN بالتسلسل وتتوقف عند أول فرع صحيح. ويتم تجاهل الفروع اللاحقة حتى لو كانت ستتطابق أيضًا.
في المثال أدناه، يكون الطلب الذي تتجاوز قيمته 1000 هو 'large'، وليس 'medium' أبدًا، لأن أول فرع متطابق هو الذي يفوز.
SELECT order_id, total,
CASE WHEN total >= 1000 THEN 'large'
WHEN total >= 100 THEN 'medium'
ELSE 'small'
END AS size_band
FROM orders;فرع ELSE
فرع ELSE هو الفرع الشامل. إذا لم يكن أي من شروط WHEN صحيحًا، يُرجع CASE قيمة ELSE.
إذا حذفت ELSE ولم يتطابق أي فرع، يُرجع CASE قيمة NULL. وهذا مصدر شائع لقيم NULL غير المتوقعة، لذا أضف ELSE صريحة عندما تريد قيمة بديلة محددة.
SELECT name,
CASE WHEN stock = 0 THEN 'out of stock' END AS note
FROM products;
-- rows with stock > 0 get NULL in note (no ELSE)يمكن أن تكون الشروط أي شيء
شرط WHEN هو مجرد تعبير منطقي، من النوع نفسه الذي تكتبه في عبارة WHERE. يمكنك استخدام المقارنات وAND وOR وBETWEEN وIN وLIKE وغير ذلك.
SELECT email,
CASE WHEN country IN ('US','CA') AND age >= 18 THEN 'eligible'
WHEN email LIKE '%@test.com' THEN 'test account'
ELSE 'review'
END AS segment
FROM users;يجب أن تكون أنواع النتائج متوافقة
يجب أن يُرجع كل فرع من فروع CASE قيمًا من نوع متوافق، لأن العمود يحتاج إلى نوع واحد. وسيؤدي مزج النصوص والأرقام إلى حدوث خطأ أو تحويل نوع غير متوقع.
إذا كنت تحتاج إلى أرقام في أحد الفروع ونص في فرع آخر، فحوّل الأنواع صراحةً حتى تتوافق.
SELECT product_id,
CASE WHEN on_sale THEN price * 0.9
ELSE price
END AS effective_price -- all branches numeric: good
FROM products;استخدام CASE في WHERE
بما أن CASE ينتج قيمة، يمكنك مقارنة نتيجته داخل عبارة WHERE. وهذا مفيد لقواعد التصفية الديناميكية.
لكن غالبًا ما يكون استخدام المنطق المنطقي المباشر في WHERE أوضح، لذا استخدم CASE في WHERE فقط عندما يؤدي التفرّع فعلًا إلى تبسيط الشرط.
SELECT *
FROM orders
WHERE CASE WHEN priority = 'high' THEN total > 0
ELSE total > 500
END;تداخل CASE
يمكنك وضع CASE داخل فرع CASE آخر للتعبير عن منطق متعدد المستويات. هذا ممكن، لكن التعبيرات المتداخلة بعمق تصبح صعبة القراءة.
حافظ على التداخل محدودًا؛ وإذا ازداد، فعادةً ما يكون استخدام عمود منفصل أو جدول بحث أوضح.
SELECT order_id,
CASE WHEN region = 'EU' THEN
CASE WHEN total > 100 THEN 'EU big'
ELSE 'EU small' END
ELSE 'other'
END AS bucket
FROM orders;استخدام CASE مع دوال التجميع
هناك نمط فعّال يتمثل في تغليف CASE داخل دالة تجميع مثل SUM أو COUNT. يتيح ذلك عدّ الصفوف أو جمعها بشكل مشروط في مرور واحد، ويُسمى أحيانًا التجميع الشرطي أو المحور.
SELECT
COUNT(*) AS total_orders,
SUM(CASE WHEN status = 'shipped' THEN 1 ELSE 0 END) AS shipped,
SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) AS pending
FROM orders;إعادة NULL عمدًا من CASE
قد تكون إعادة NULL من أحد الفروع هي ما تريده تمامًا، مثل إخفاء قيمة لا تريد عرضها، أو تمريرها إلى دالة تجميع لاحقة تتجاهل قيم NULL.
في هذه الحالة، تحتفظ الطلبات الكبيرة فقط بإجماليها؛ بينما تصبح الطلبات الأخرى NULL، ولذلك سيتجاهلها AVG.
SELECT order_id,
CASE WHEN total >= 1000 THEN total
ELSE NULL
END AS large_order_total
FROM orders;اختبار سريع
تأملوا هذا التعبير لصف تكون فيه total = 1500:
CASE WHEN total >= 100 THEN 'medium' WHEN total >= 1000 THEN 'large' ELSE 'small' END
ما القيمة التي يُرجعها؟
مراجعة: تعبير CASE
لقد تعلمتم أساسيات المنطق الشرطي في SQL:
CASE WHEN ... THEN ... ELSE ... ENDيُرجع قيمة واحدة لكل صف- يُفحَص كل فرع من الأعلى إلى الأسفل؛ يُعتمد أول تطابق
- يؤدي حذف
ELSEإلى إرجاعNULLعندما لا يتطابق أي فرع - يجب أن تُرجع جميع الفروع أنواعًا متوافقة
- يمكن استخدام
CASEفيSELECTوWHEREوداخل الدوال التجميعية
بعد ذلك، سنقارن بين الصيغتين النحويتين لـ CASE.
SELECT name,
CASE WHEN price > 100 THEN 'expensive'
WHEN price > 20 THEN 'mid'
ELSE 'cheap'
END AS tier
FROM products;الأسئلة الشائعة
هل درس «تعبير CASE» مجاني؟
نعم — نص درس «تعبير CASE» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.
ماذا ستتعلم في «تعبير CASE»؟
منطق IF/THEN داخل الاستعلام تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟
لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «تعبير CASE»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟
نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.