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

טיפול ב-NULL: IS NULL ו-COALESCE

במערך הנתונים employees, אנדריאה קוסטה מיוחדת: יש לו department_id = NULL. כבר התחננת נגד NULL (עם LEFT JOIN), אבל הגיע הזמן לקחת את זה ברצינות: NULLs ב-SQL להתנהג שונה מכל ערך אחר, והתעלמות מהם היא אחד מהערכים הסיבות העיקריות לבאגים בקוד הייצור.

NULL אינו אפס, לא מחרוזת ריקה

NULL פירושו ערך לא ידוע/חסר. זה לא 0, לא '', לא false. זה "אני לא יודע". מכאן נובע מאפיין מפתיע: NULL אינו שווה לכלום, אפילו לא לעצמו.

SQL
-- All these expressions return NULL (not true!):
SELECT NULL = NULL;       -- NULL
SELECT NULL = 0;          -- NULL
SELECT NULL <> 'qualcosa'; -- NULL

תוצאה קונקרטית: WHERE column = NULL אף פעם לא עובד. אתה חייב להשתמש האופרטורים הייעודיים IS NULL / IS NOT NULL:

SQL
-- Employees without a department:
SELECT first_name, last_name
FROM   employees
WHERE  department_id IS NULL;

-- Employees WITH a department:
SELECT first_name, last_name
FROM   employees
WHERE  department_id IS NOT NULL;

COALESCE - החזרה NULL

לעתים קרובות אתה רוצה להציג משהו במקום NULL כאשר הנתונים הם חסר: המחרוזת '(none)', אפס, תאריך ברירת מחדל. הפונקציה ש האם זה בדיוק COALESCE(a, b, c, ...): הוא מחזיר את הראשון ארגומנט שאינו NULL ברשימה.

SQL
-- Show the department_id, or 0 if missing:
SELECT first_name, last_name, COALESCE(department_id, 0) AS dept
FROM   employees;

בשילוב עם LEFT JOIN הוא הופך חזק להפליא עבור דוחות:

SQL
SELECT e.first_name,
       e.last_name,
       COALESCE(d.name, '(nessun dipartimento)') AS dipartimento
FROM   employees   AS e
LEFT JOIN departments AS d ON e.department_id = d.id;

תוצאה: כל העובדים חזרו, עם שם המחלקה או מפורש תווית למי שאין לו.

NULL ומצטברים

פונקציות מצטברות התעלם NULLs (למעט COUNT(*)):

  • COUNT(department_id) סופר רק את השורות עם ערך;
  • ממוצעים של AVG(salary) תוך התעלמות מ-NULLs - זה לא מתייחס אליהם כ-0;
  • SUM(...) מסכם רק את הערכים שאינם NULL.

זה כמעט תמיד מה שאתה רוצה. אבל טוב לדעת: אם כן מחפש את "המספר הכולל של העובדים" השתמש ב-COUNT(*), לא COUNT(department_id).

נסה את זה

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

עבור כל עובד, הצג שם פרטי (שם_שם), שם משפחה (שם_משפחה) ועמודה 'דיpartimento_id' השווה למחלקה_מזהה או -1 אם לא הוקצה. שלוש עמודות, שורה אחת לעובד.

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

השתמש ב-COALESCE(department_id, -1) כדי להחליף NULLs ב-1.

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

סקירת התרגיל

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

החזר שם פרטי (שם_שם), שם משפחה (שם_משפחה) ושם מחלקה (מחלקות.שם) של כל העובדים, תוך הצגת '(nessuno)' כאשר המחלקה חסרה. השתמש ב-LEFT JOIN + COALESCE.

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

COALESCE(d.name, '(nessuno)') מטפל ב-NULL שהוכנס על ידי ה-LEFT JOIN.

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