Przejdź do głównej treści
eLearner.app
Moduł 4 · Lekcja 2 z 414/57 w kursie~10 min
Lekcje modułu (2/4)

Obsługa wartości NULL: IS NULL i COALESCE

W zbiorze danych employees Andrea Costa jest kimś wyjątkowym: tak KODEF1. Otarłeś się już o NULL (z LEFT JOIN), ale nadszedł czas, aby potraktować to poważnie: NULL w SQL zachowywać się odmiennie od wszelkich innych wartości, a ignorowanie ich jest jedną z nich najczęstsze przyczyny błędów w kodzie produkcyjnym.

NULL nie jest zerem ani pustym ciągiem znaków

NULL oznacza nieznana/brakująca wartość. To nie jest 0, nie '', nie KODEF3. To jest „nie wiem”. Z tego wynika zaskakująca właściwość: NULL nie jest równy niczemu, nawet samemu sobie.

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

Konkretna konsekwencja: WHERE column = NULL nigdy nie działa. Musisz użyć dedykowani operatorzy 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 — rezerwa NULL

Często chcesz wyświetlić coś zamiast NULL, gdy dane są brak: ciągu znaków '(none)', zero, data domyślna. Funkcja, która robi dokładnie to COALESCE(a, b, c, ...): zwraca pierwszy Argument inny niż NULL na liście.

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

W połączeniu z LEFT JOIN staje się niezwykle potężny w przypadku raportów:

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;

Wynik: wszyscy pracownicy wrócili z nazwą działu lub jawnie Etykieta dla tych, którzy jej nie mają.

NULL i agregaty

Funkcje agregujące ignorują NULL (z wyjątkiem COUNT(*)):

  • COUNT(department_id) zlicza tylko wiersze z wartością;
  • średnie AVG(salary) ignorują NULLnie traktują ich jako 0;
  • SUM(...) sumuje tylko wartości inne niż NULL.

Prawie zawsze tego chcesz. Ale dobrze jest wiedzieć: jeśli tak jest szukając „całkowitej liczby pracowników” użyj COUNT(*), nie KODEF1.

Spróbuj

Ćwiczenie#sql.m4.l2.e1
Próby: 0Ładowanie...

Dla każdego pracownika pokaż imię (imię), nazwisko (nazwisko) i kolumnę „dipartimento_id”, która jest równa jego identyfikatorowi działu lub -1, jeśli nie jest przypisana. Trzy kolumny, jeden wiersz na pracownika.

Ładowanie edytora...
Pokaż wskazówkę

Użyj COALESCE(id_departmentu, -1), aby zastąpić wartości NULL wartością -1.

Rozwiązanie dostępne po 3 próbach

Przejrzyj ćwiczenie

Ćwiczenie#sql.m4.l2.e2
Próby: 0Ładowanie...

Zwróć imię (imię), nazwisko (nazwisko) i nazwę działu (departments.name) WSZYSTKICH pracowników, wyświetlając „(nessuno)”, gdy brakuje działu. Użyj LEWEGO DOŁĄCZENIA + ŁĄCZENIA.

Ładowanie edytora...
Pokaż wskazówkę

COALESCE(d.name, '(nessuno)') obsługuje NULL wprowadzone przez LEFT JOIN.

Rozwiązanie dostępne po 3 próbach