שיעורי מודול (3/4)
היגיון מותנה: CASE WHEN
כל מה שראינו עד כה מחלץ נתונים כפי שהם. אבל לעתים קרובות אתה רוצה
כדי לשנות את זה: לסווג משכורות לדרגות, לסמן עובדים חדשים בתור
"ג'וניור", תרגם קוד מספרי לתווית ניתנת לקריאה. התקן של SQL
הכלי לכך נקרא CASE WHEN.
התחביר: מיני if/else
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.
-- 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
שלושה מקומות שחוזרים על עצמם:
- ב-
SELECTכדי ליצור עמודות נגזרות (הדוגמה למעלה). - ב-
ORDER BYלמיון "מותאם אישית":SQLORDER BY CASE department_id WHEN 1 THEN 0 ELSE 1 END, last_name; -- Engineering first, then the rest, alphabetically by last name. - בתוך פונקציות מצטבר ל"ספירה מותנית":
הדפוס הזה -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)- הוא הנפוץ ביותר "ספירה מותנית" בשימוש במרכזי מחוונים.
הצורה ה"קומפקטית".
יש גם גרסה קצרה יותר כאשר אתה משווה ביטוי בודד כנגד ערכים מדויקים:
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, פשוט יותר קומפקטי. זה עובד רק בשביל שוויון מדויק: אם
אתה צריך >= או השוואה אחרת, אתה צריך לחזור למורחב
טופס.
נסה את זה
עבור כל עובד, הצג שם פרטי (שם_שם), שם משפחה (שם_משפחה) ועמודת 'דרג' שהיא 'אלטו' אם השכר הוא לפחות 50000, אחרת 'סטנדרט'. שלוש עמודות, שורה אחת לעובד.
הצג רמז
התנאי הוא שכר >= 50000. זכור לסגור את ה-CASE ב-END ולהשתמש בכינוי 'tier'.
הפתרון זמין לאחר 3 ניסיונות
סקירת התרגיל
עבור כל מחלקה (מזהה_מחלקה), ספור לכמה עובדים יש שכר גבוה (>= 50000) וכמה סטנדרטי (< 50000) באמצעות SUM(CASE...). שלוש עמודות: department_id, high, standard. הזמנה לפי department_id (NULLS LAST).
הצג רמז
תבנית SUM(CASE WEN ... THEN 1 ELSE 0 END) היא הספירה המותנית.
הפתרון זמין לאחר 3 ניסיונות