Praca z NULL pojawia się w różnych sytuacjach: od ogarniania brakujących danych w raportach po filtrowanie i sortowanie. Gdyby był wybór między brakiem wartości w tabeli a dziwną liczbą typu 9999, większość wybrałaby NULL — serio, to nie jest najwygodniejsze, ale przynajmniej uczciwe. Zobaczmy kilka typowych case’ów.
Przykład: sortowanie produktów z brakującymi cenami
Wyobraź sobie, że prowadzisz sklep internetowy i masz tabelę produktów:
| product_id | name | price |
|---|---|---|
| 1 | Telefon | 45000 |
| 2 | Laptop | NULL |
| 3 | Aparat | 25000 |
| 4 | Smartwatch | NULL |
Chcemy posortować produkty po cenie, przy czym produkty bez ceny (NULL) mają być na końcu.
SELECT product_id, name, price
FROM products
ORDER BY price ASC NULLS LAST;
Wynik:
| product_id | name | price |
|---|---|---|
| 3 | Aparat | 25000 |
| 1 | Telefon | 45000 |
| 2 | Laptop | NULL |
| 4 | Smartwatch | NULL |
Zwróć uwagę na kluczową konstrukcję NULLS LAST. Domyślnie w PostgreSQL dla ASC wartości NULL lądują na początku, ale z tym parametrem wrzucamy je na koniec.
Przykład: filtrowanie studentów bez daty urodzenia
Mamy tabelę studentów i chcemy wybrać tylko tych, którym nie wpisano daty urodzenia.
| student_id | name | birth_date |
|---|---|---|
| 1 | Otto Art | 2000-01-15 |
| 2 | Anna Song | NULL |
| 3 | Alex Lin | 1999-05-10 |
| 4 | Maria Chi | NULL |
Zapytanie:
SELECT student_id, name
FROM students
WHERE birth_date IS NULL;
Wynik:
| student_id | name |
|---|---|
| 2 | Anna Song |
| 4 | Maria Chi |
Udało się wyciągnąć info o studentach, którym nie znamy daty urodzenia.
Przykłady użycia funkcji do ogarniania NULL
Przykład: obliczanie sumy końcowej z uwzględnieniem możliwych NULL
W tabeli zamówień trzymamy kwoty zamówień. Ale nie zawsze są one wpisane, więc musimy brać pod uwagę, że czasem suma to 0.
Przykładowe dane:
| order_id | customer_name | order_amount |
|---|---|---|
| 1 | Alex | 1200 |
| 2 | Maria | 2500 |
| 3 | Max | NULL |
| 4 | Xena | 3100 |
Zapytanie:
SELECT SUM(COALESCE(order_amount, 0)) AS total_amount
FROM orders;
Wynik:
| total_amount |
|---|
| 6800 |
Używamy COALESCE(order_amount, 0), żeby podmienić NULL na 0 przed sumowaniem. Dzięki temu unikamy błędów albo dziwnych wyników.
Przykład: wyświetlanie tekstu zamiast NULL
| customer_name | order_amount |
|---|---|
| Alex | 1200 |
| Maria | 2500 |
| Max | NULL |
| Xena | 3100 |
W raporcie trzeba wyświetlić tekst "Nie podano" dla wszystkich pustych danych zamiast NULL.
SELECT
customer_name,
COALESCE(order_amount::TEXT, 'Nie podano') AS order_status
FROM orders;
Wynik:
| customer_name | order_status |
|---|---|
| Alex | 1200 |
| Maria | 2500 |
| Max | Nie podano |
| Xena | 3100 |
COALESCE() pozwala wyświetlić dowolny tekst, jeśli wartość to NULL.
Bardziej złożone scenariusze pracy z NULL
| customer_name | order_amount |
|---|---|
| Alex | 1200 |
| Maria | 2500 |
| Max | NULL |
| Xena | 3100 |
Naszym zadaniem jest posortować zamówienia tak, żeby te z brakującą kwotą były na początku, a potem od największej do najmniejszej kwoty.
SELECT customer_name, order_amount
FROM orders
ORDER BY order_amount DESC NULLS FIRST;
Wynik:
| customer_name | order_amount |
|---|---|
| Max | NULL |
| Xena | 3100 |
| Maria | 2500 |
| Alex | 1200 |
Tutaj użyliśmy NULLS FIRST, żeby NULL były przed resztą.
Przykład: filtrowanie danych z podmianą wartości NULL
| student_id | name | birth_date |
|---|---|---|
| 1 | Otto Art | 2000-01-15 |
| 2 | Anna Song | NULL |
| 3 | Alex Lin | 1999-05-10 |
| 4 | Maria Chi | NULL |
W niektórych raportach trzeba wyświetlić tylko te wiersze, gdzie wartość jest wpisana albo podmienić ją na "Nieznane", jeśli to NULL.
SELECT
student_id,
name,
COALESCE(birth_date::TEXT, 'Nieznane') AS birth_date_info
FROM students;
Wynik:
| student_id | name | birth_date_info |
|---|---|---|
| 1 | Otto Art | 2000-01-15 |
| 2 | Anna Song | Nieznane |
| 3 | Alex Lin | 1999-05-10 |
| 4 | Maria Chi | Nieznane |
To szczególnie przydatne przy robieniu raportów, gdzie ważne jest pokazanie, że danych brak.
Praktyczne wskazówki
Praca z NULL wymaga większej uwagi. Oto kilka przydatnych tipów:
- Używaj
IS NULLiCOALESCE()do sprawdzania i podmieniania brakujących wartości. - Pamiętaj, że funkcje agregujące ignorują
NULL, pozaCOUNT(*). - Przy sortowaniu pamiętaj o słowach kluczowych
NULLS FIRSTiNULLS LAST. - W raportach zawsze napisz, jak ogarniasz
NULL, żeby nie było nieporozumień z ekipą.
Takie ogarnięcie tematu pozwoli Ci nie tylko pisać poprawne zapytania, ale też zrobić wrażenie na rozmowie o pracę. Bo umiejętność pracy z realnymi danymi zawsze jest bardziej ceniona niż sama teoria!
GO TO FULL VERSION