Pogadajmy o jeszcze jednej funkcji do pracy z tajemniczym NULL — NULLIF(). Przyda się, kiedy musisz zamienić konkretne wartości na NULL, żeby poprawnie ogarniać dane. Zapnij pasy, będzie ciekawie!
Funkcja NULLIF() to świetne narzędzie w PostgreSQL, które pozwala porównać dwie wartości i zwrócić NULL, jeśli są takie same, albo zwrócić pierwszą wartość, jeśli się różnią. To jakby mówiła: "Jeśli te wartości są identyczne, zapomnijmy o nich!"
Oto prosta składnia funkcji:
NULLIF(value1, value2)
Jeśli value1 i value2 są równe, wynikiem będzie NULL. Jeśli są różne, wynikiem będzie value1.
Przykład:
SELECT NULLIF(10, 10); -- Wynik: NULL
SELECT NULLIF(10, 20); -- Wynik: 10
SELECT NULLIF('hello', 'hello'); -- Wynik: NULL
SELECT NULLIF('hello', 'world'); -- Wynik: 'hello'
Proste, nie? To teraz spróbujmy użyć tej funkcji w realnych zadaniach.
Przykład 1: Zapobieganie dzieleniu przez zero
Dzielenie przez zero to koszmar każdego programisty. W SQL próba podzielenia przez zero wyrzuci błąd. I tu właśnie wchodzi NULLIF().
Wyobraź sobie: mamy tabelę sales z dwoma kolumnami: revenue (przychody) i expenses (wydatki). Chcemy policzyć rentowność wydatków (revenue / expenses), ale czasem wydatki są równe zero. Jeśli po prostu odpalimy zapytanie bez żadnej kontroli, dostaniemy błąd dzielenia przez zero.
Tabela sales:
| revenue | expenses |
|---|---|
| 1000 | 200 |
| 1500 | 0 |
| 2000 | 250 |
Błędne zapytanie:
SELECT revenue / expenses AS profitability
FROM sales;
-- Błąd: dzielenie przez zero!
Rozwiązanie z NULLIF():
SELECT revenue / NULLIF(expenses, 0) AS profitability
FROM sales;
Wynik:
| profitability |
|---|
| 5.00 |
| NULL |
| 8.00 |
Teraz, jeśli expenses to 0, NULLIF(expenses, 0) zwraca NULL, a dzielenie przez NULL nie rzuca błędu, tylko daje NULL.
Przykład 2: Zamiana identycznych wartości na NULL
Wyobraź sobie, że masz tabelę z danymi studentów, gdzie są kolumny first_name i preferred_name. Czasem studenci wolą swoje prawdziwe imię, a czasem wybierają coś innego. Jeśli oba imiona są takie same, nie ma sensu pokazywać preferred_name.
Tabela students:
| first_name | preferred_name |
|---|---|
| John | Johnny |
| Anna | Anna |
| Alex | Lex |
Zapytanie z NULLIF():
SELECT first_name,
NULLIF(preferred_name, first_name) AS display_name
FROM students;
Wynik:
| first_name | display_name |
|---|---|
| John | Johnny |
| Anna | NULL |
| Alex | Lex |
Kiedy preferred_name i first_name są równe, wynikiem będzie NULL.
Przykład 3: Filtrowanie danych
Czasem trzeba wybrać tylko te wiersze, gdzie wartości w dwóch kolumnach są różne. Na przykład mamy tabelę zamówień z original_price i discounted_price. Chcemy znaleźć zamówienia, gdzie była zniżka.
Tabela orders:
| order_id | original_price | discounted_price |
|---|---|---|
| 1 | 100 | 100 |
| 2 | 200 | 180 |
| 3 | 150 | 150 |
Zapytanie z NULLIF():
SELECT order_id, original_price, discounted_price
FROM orders
WHERE NULLIF(original_price, discounted_price) IS NOT NULL;
Wynik:
| order_id | original_price | discounted_price |
|---|---|---|
| 2 | 200 | 180 |
Tylko zamówienia ze zniżką trafiły do wyniku.
Praktyczne case'y użycia NULLIF()
Case 1: Wybór opcjonalnej wartości
Przy pracy z danymi czasem trzeba wybrać wartość z kilku kolumn, pomijając te, które są równe konkretnej wartości. Na przykład mamy listę pracowników z ich pensjami: base_salary i bonus. Jeśli bonus to 0, chcemy ustawić go na 999.
Tabela employees:
| employee_id | base_salary | bonus |
|---|---|---|
| 1 | 50000 | 10000 |
| 2 | 40000 | 0 |
| 3 | 60000 | 5000 |
Zapytanie z NULLIF():
SELECT employee_id,
base_salary + COALESCE(NULLIF(bonus, 0), 999) AS total_salary
FROM employees;
Wynik:
| employee_id | total_salary |
|---|---|
| 1 | 60000 |
| 2 | 40999 |
| 3 | 65000 |
Jeśli bonus to 0, zamieni się na 999.
Case 2: Liczenie wierszy
Możemy użyć NULLIF() do uproszczenia złożonych warunków filtrowania. Na przykład mamy tabelę użytkowników i chcemy w jednym zapytaniu poznać ich całkowitą liczbę oraz liczbę zarejestrowanych użytkowników (bez statusu guest).
SELECT
COUNT(*) AS total_users,
COUNT(NULLIF(status, 'guest')) AS registered_users
FROM users;
I tak, dzięki jednej funkcji NULLIF() możemy ogarnąć mnóstwo zadań: od zapobiegania błędom po zwykłe poprawienie czytelności kodu. Teraz, kiedy już wiesz jak to działa, jesteś o krok bliżej do ogarniania danych w PostgreSQL jak pro!
GO TO FULL VERSION