الانتقال إلى المحتوى الرئيسي
الوحدة 4 · الدرس 3 من 415/57 في الدورة~10 min
دروس الوحدة (3/4)

المنطق الشرطي: الحالة متى

كل ما رأيناه حتى الآن يستخرج البيانات كما هي. في كثير من الأحيان، على الرغم من ذلك، تريد تحويلها: تصنيف الرواتب إلى مستويات، ووضع علامة على التعيينات الجديدة "جونيور"، قم بترجمة رمز رقمي إلى تسمية قابلة للقراءة. معيار SQL تسمى الأداة الخاصة بذلك CASE WHEN.

بناء الجملة: مصغرة إذا/آخر

SQL
CASE
  WHEN condition_1 THEN value_1
  WHEN condition_2 THEN value_2
  ...
  ELSE default_value
END

يُقرأ تمامًا مثل if/else if/else بأي لغة: يتم تقييم SQL الشروط ** بالترتيب ** ويتوقف عند أول صحيح، ويعود المقابلة value. إذا لم يكن أي شيء صحيحًا، فسيتم إرجاع القيمة ELSE. إذا كنت احذف ELSE ولا يوجد فرع مطابق، فسيتم إرجاع NULL.

SQL
-- Classify employees by salary tier:
SELECT first_name,
       last_name,
       salary,
       CASE
         WHEN salary >= 50000 THEN 'Senior'
         WHEN salary >= 35000 THEN 'Mid'
         ELSE                       'Junior'
       END AS tier
FROM   employees;

يعيش CASE ** داخل SELECT**: فهو ينتج عمودًا مثل أي عمود آخر الدالة، ومن الطبيعي تمامًا منحها اسمًا مستعارًا باستخدام AS (هنا محمي_INLINE_9).

أين تستخدم CASE

ثلاثة مواضع متكررة:

  1. في SELECT لإنشاء أعمدة مشتقة (المثال أعلاه).
  2. في ORDER BY للفرز "المخصص":
    SQL
    ORDER BY CASE department_id WHEN 1 THEN 0 ELSE 1 END, last_name;
    -- Engineering first, then the rest, alphabetically by last name.
  3. الوظائف التجميعية الداخلية إلى "العد المشروط":
    SQL
    SELECT
      COUNT(*) AS total,
      SUM(CASE WHEN salary >= 50000 THEN 1 ELSE 0 END) AS senior,
      SUM(CASE WHEN salary <  35000 THEN 1 ELSE 0 END) AS junior
    FROM employees;
    هذا النمط — SUM(CASE WHEN … THEN 1 ELSE 0 END) — هو الأكثر شيوعًا "العد الشرطي" المستخدم في لوحات المعلومات.

النموذج "المدمج".

يوجد أيضًا متغير أقصر عند مقارنة تعبير واحد ضد القيم الدقيقة:

SQL
CASE department_id
  WHEN 1 THEN 'Ingegneria'
  WHEN 2 THEN 'Vendite'
  ELSE       'Altro'
END

إنه يعادل CASE WHEN department_id = 1 THEN ... WHEN department_id = 2 THEN ... END، ولكنه أكثر إحكاما. إنه يعمل فقط من أجل المساواة التامة: إذا تحتاج إلى >= أو مقارنة أخرى، عليك العودة إلى الموسعة شكل.

جربه

تمرين#sql.m4.l3.e1
المحاولات: 0جارٍ التحميل…

لكل موظف، أظهر الاسم الأول (الاسم الأول)، والاسم الأخير (اسم العائلة) وعمود "الطبقة" الذي يكون "ألتو" إذا كان الراتب 50000 على الأقل، وإلا "قياسي". ثلاثة أعمدة، صف واحد لكل موظف.

جارٍ تحميل المحرر…
إظهار التلميح

الشرط هو الراتب >= 50000. تذكر إغلاق الحالة بـ END واستخدام الاسم المستعار "الطبقة".

الحل متاح بعد 3 من المحاولات

تمرين المراجعة

تمرين#sql.m4.l3.e2
المحاولات: 0جارٍ التحميل…

لكل قسم (department_id)، قم بحساب عدد الموظفين الذين لديهم راتب مرتفع (>= 50000) وعدد الموظفين القياسيين (< 50000) باستخدام SUM(CASE...). ثلاثة أعمدة: Department_id، High، Standard. الترتيب حسب Department_id (NULLS LAST).

جارٍ تحميل المحرر…
إظهار التلميح

النمط SUM(CASE WHEN...THN 1 ELSE 0 END) هو العدد الشرطي.

الحل متاح بعد 3 من المحاولات