CodeGym /Kursy /SQL SELF /Obsługa NULL w obliczeniach z COALESCE()

Obsługa NULL w obliczeniach z COALESCE()

SQL SELF
Poziom 9 , Lekcja 3
Dostępny

Dziś znowu zagłębimy się w temat obsługi NULL i poznamy bardzo przydatną funkcję — COALESCE(). Ta funkcja pozwala elegancko radzić sobie z wartościami NULL w twoich danych.

Spójrzmy na taki przykład: masz tabelę z danymi o pracownikach, ale niektórzy z nich nie mają podanej pensji. Co się stanie, jeśli spróbujemy podnieść wszystkim pensje? Nic dobrego. Nie da się wykonywać operacji na NULL. A co jeśli chcemy zamienić NULL pensje na, powiedzmy, 0? Tu na scenę wchodzi COALESCE().

COALESCE() — to funkcja, która zwraca pierwszą nie-NULL wartość z przekazanej listy argumentów. Jeśli wszystkie wartości na liście to NULL, funkcja zwraca NULL. Mówiąc prosto, ona mówi: "Daj mi pierwszą sensowną wartość, jaką znajdziesz, proszę!"

Składnia

COALESCE(value1, value2, ..., value_n)

value1, value2, ..., value_n — to argumenty, które przekazujesz do funkcji. Zwróci ona pierwszą wartość, która nie jest NULL.

Przykłady działania COALESCE()

Pokażę kilka przykładów.

Przykład 1: Zamiana NULL na 0

Załóżmy, że mamy tabelę salaries:

id name salary
1 Otto 50000
2 Maria NULL
3 Alex 60000
4 Anna NULL

Chcemy policzyć sumę wszystkich pensji - to proste:

SELECT SUM(salary) AS total_salary
FROM salaries;

Funkcja SUM() ignoruje NULL, więc nie ma problemu.

Ale potem chcemy policzyć sumę pensji, jeśli każdemu damy premię 1000.

SELECT SUM(salary+1000) AS total_salary
FROM salaries;

I wynik zaczyna się rozjeżdżać. Najlepiej od razu pozbyć się wartości NULL za pomocą funkcji COALESCE i zamienić je na 0. Zobaczmy jak to zrobić:

SELECT SUM(COALESCE(salary, 0)) AS total_salary
FROM salaries;

Wynik:

total_salary
110000

Tak jest lepiej i pewniej.

Przykład 2: Zamiana NULL na wartość domyślną

Załóżmy, że mamy tabelę students z imionami i adresami:

id name address
1 Anna Kanne
2 Peter NULL
3 Lisa Painful
4 Alex NULL

Chcemy zamienić NULL w adresach na "Nie podano":

SELECT name, COALESCE(address, 'Nie podano') AS resolved_address
FROM students;

Wynik zapytania:

name resolved_address
Anna Kanne
Peter Nie podano
Lisa Painful
Alex Nie podano

Przykład 3: Użycie wielu wartości

Czasem trzeba zamienić NULL nie na jedną wartość, ale na całą sekwencję wartości. Na przykład chcemy wybrać imię, imię dla znajomych albo użyć "Bez imienia", jeśli żadne nie jest podane. Tabela users:

user_id first_name short_name full_name
1 John Jonny Johnny Walker
2 NULL Pete Peter Kamen
3 NULL NULL

Zapytanie:

SELECT user_id,
       COALESCE(first_name, short_name, 'Bez imienia') AS display_name
FROM users;

Wynik:

user_id display_name
1 John
2 Pete
3 Bez imienia

Praktyczne zastosowanie COALESCE()

W praktyce COALESCE() — to koło ratunkowe do pracy z nieidealnymi danymi.

Zobaczmy, jak pomaga w różnych zadaniach.

Przykład 1: Zamiana wartości w polach tekstowych

Wyjściowa tabela customers:

id name address
1 Alex Lin 123 Maple St
2 Maria Chi NULL
3 Anna Song 456 Oak Ave
4 Otto Art NULL
5 Liam Park 789 Pine Rd

Zapytanie:

SELECT name, COALESCE(address, 'Nie podano') AS address
FROM customers;

Wynik:

name address
Alex Lin 123 Maple St
Maria Chi Nie podano
Anna Song 456 Oak Ave
Otto Art Nie podano
Liam Park 789 Pine Rd

Przykład 2: Przygotowanie danych do raportów

Wyjściowa tabela sales:

id product price
1 Widget A 100
2 Widget B NULL
3 Widget C 250
4 Widget D NULL
5 Widget E 300

Zapytanie:

SELECT SUM(COALESCE(price, 0)) AS total_sales
FROM sales;

Wynik:

total_sales
650

Typowe błędy przy użyciu COALESCE()

Chociaż COALESCE() wydaje się prostą i uniwersalną funkcją, można się na niej przejechać na kilka sposobów.

Niezgodność typów danych. Wszystkie argumenty przekazywane do COALESCE() muszą być zgodne typem danych. Na przykład nie można mieszać wartości tekstowych i liczbowych.

-- Błąd
SELECT COALESCE(salary, 'Nie podano') FROM employees; 
-- salary — pole liczbowe, a 'Nie podano' — tekst.

Ignorowanie kolejności argumentów. COALESCE() zwraca pierwszą nie-NULL wartość, więc kolejność argumentów ma znaczenie.

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION