CodeGym /Kursy /SQL SELF /Funkcja NULLIF() — składnia i przykłady użycia

Funkcja NULLIF() — składnia i przykłady użycia

SQL SELF
Poziom 9, Lekcja 4
Dostępny

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!

2
Zadanie
SQL SELF, poziom 9, lekcja 4
Niedostępne
Zapobieganie dzieleniu przez zero z użyciem `NULLIF()`
Zapobieganie dzieleniu przez zero z użyciem `NULLIF()`
2
Zadanie
SQL SELF, poziom 9, lekcja 4
Niedostępne
Filtrowanie zamówień ze zniżką za pomocą `NULLIF()`
Filtrowanie zamówień ze zniżką za pomocą `NULLIF()`
1
Ankieta/quiz
Praca z NULL, poziom 9, lekcja 4
Niedostępny
Praca z NULL
Praca z NULL
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION