דילוג לתוכן המרכזי
מודול 4 · שיעור 3 מתוך 415/57 בקורס~10 min
שיעורי מודול (3/4)

היגיון מותנה: CASE WHEN

כל מה שראינו עד כה מחלץ נתונים כפי שהם. אבל לעתים קרובות אתה רוצה כדי לשנות את זה: לסווג משכורות לדרגות, לסמן עובדים חדשים בתור "ג'וניור", תרגם קוד מספרי לתווית ניתנת לקריאה. התקן של SQL הכלי לכך נקרא CASE WHEN.

התחביר: מיני if/else

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 (כאן tier).

היכן להשתמש ב-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. זכור לסגור את ה-CASE ב-END ולהשתמש בכינוי 'tier'.

הפתרון זמין לאחר 3 ניסיונות

סקירת התרגיל

פעילות גופנית#sql.m4.l3.e2
ניסיונות: 0טוען...

עבור כל מחלקה (מזהה_מחלקה), ספור לכמה עובדים יש שכר גבוה (>= 50000) וכמה סטנדרטי (< 50000) באמצעות SUM(CASE...). שלוש עמודות: department_id, high, standard. הזמנה לפי department_id (NULLS LAST).

טוען עורך...
הצג רמז

תבנית SUM(CASE WEN ... THEN 1 ELSE 0 END) היא הספירה המותנית.

הפתרון זמין לאחר 3 ניסיונות