COALESCE, NULLIF i ISNULL
Podstawianie wartości domyślnych oraz różnice między COALESCE a funkcjami specyficznymi dla dostawcy
COALESCE, NULLIF i ISNULL to bezpłatna lekcja Coding Interview Prep na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Coding Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.
Zastępowanie wartości NULL
Skoro można już wykrywać NULL, kolejną umiejętnością potrzebną na rozmowie jest jego zastępowanie rozsądną wartością domyślną. Przenośnym, standardowym narzędziem do tego celu jest COALESCE.
Oprócz niego poznają Państwo NULLIF, które działa w przeciwnym kierunku, zamieniając określoną wartość na NULL, oraz funkcje dostawców ISNULL (SQL Server) i IFNULL (MySQL), które kandydaci często mylą z COALESCE.
Dokładna znajomość różnic między nimi, zwłaszcza liczby argumentów i typu zwracanego wyniku, jest częstym tematem pytań na etapie selekcji.
Podstawy COALESCE
COALESCE przyjmuje dowolną liczbę argumentów i zwraca pierwszy, który nie jest NULL, sprawdzając je od lewej do prawej. Jeśli wszystkie argumenty mają wartość NULL, zwraca NULL.
Jest zgodne ze standardem ANSI i działa w każdej najważniejszej bazie danych, dlatego powinno być odpowiedzią domyślną. Należy go używać do dostarczania wartości zastępczych przy wyświetlaniu, obliczeniach lub grupowaniu.
-- Show 0 instead of NULL for missing bonuses
SELECT name, COALESCE(bonus, 0) AS bonus
FROM employees;
-- Multiple fallbacks, first non-NULL wins
SELECT COALESCE(mobile_phone, home_phone, 'no phone') AS contact
FROM customers;COALESCE stosuje ewaluację z krótkim spięciem
To subtelność, o którą często pytają rekruterzy: COALESCE koncepcyjnie oblicza argumenty od lewej do prawej i zatrzymuje się przy pierwszym, który nie jest NULL. Dzięki temu późniejsze, kosztowne wyrażenie nie jest potrzebne, gdy wcześniejsze rozstrzygnie wynik.
W praktyce optymalizatory niektórych silników mogą nadal obliczać argumenty z wyprzedzeniem, dlatego nie należy polegać na COALESCE jako zabezpieczeniu przed błędami, takimi jak dzielenie przez zero. Gwarantowane jest jednak pierwszeństwo od lewej do prawej, czyli to, która wartość zostanie wybrana.
-- Prefer the manual override, else the computed value,
-- else a constant default
SELECT COALESCE(manual_price, list_price * 1.1, 9.99) AS price
FROM products;COALESCE a typ danych wyniku
Subtelna pułapka: typ danych wyniku COALESCE jest określany przez priorytet typów wszystkich połączonych argumentów, a nie tylko pierwszego z nich. Łączenie niezgodnych typów może powodować błędy lub nieoczekiwane obcinanie danych.
Na przykład COALESCE zastosowane do kolumny całkowitoliczbowej i wartości domyślnej będącej ciągiem znaków może zakończyć się błędem lub niejawną konwersją, zależnie od silnika. Rekruterzy wykorzystują to, aby sprawdzić, czy kandydat bierze pod uwagę typy.
-- Risky: integer column with a string fallback
-- may error or force a cast depending on dialect
SELECT COALESCE(score, 'N/A') FROM tests;
-- Safer: keep the fallback type-compatible, or cast explicitly
SELECT COALESCE(CAST(score AS VARCHAR), 'N/A') FROM tests;ISNULL (SQL Server) a COALESCE
SQL Server udostępnia funkcję ISNULL(expr, replacement). Wygląda ona podobnie do COALESCE, ale różni się w kilku ważnych aspektach, które rekruterzy chętnie porównują:
- Liczba argumentów: ISNULL przyjmuje dokładnie dwa argumenty, a COALESCE może przyjmować wiele.
- Typ zwracany: ISNULL używa typu pierwszego argumentu, co może spowodować obcięcie wartości zastępczej. COALESCE używa łącznego priorytetu typów.
- Przenośność: ISNULL jest dostępne wyłącznie w SQL Server, a COALESCE jest zgodne ze standardem ANSI.
Warto powiedzieć wprost: ze względu na przenośność i przewidywalne typowanie należy preferować COALESCE.
-- SQL Server: ISNULL may truncate the replacement to
-- the first argument's type (e.g. CHAR(1))
SELECT ISNULL(code, 'UNKNOWN') FROM items;
-- If code is CHAR(1), 'UNKNOWN' becomes 'U'
-- COALESCE picks the wider type and keeps 'UNKNOWN'
SELECT COALESCE(code, 'UNKNOWN') FROM items;IFNULL i NVL
Inne dialekty mają własne dwuargumentowe skróty:
- MySQL / SQLite:
IFNULL(expr, replacement) - Oracle:
NVL(expr, replacement)orazNVL2jako wariant then/else
Wszystkie trzy działają podobnie jak dwuargumentowe COALESCE. Jeśli pytanie dotyczy konkretnie idiomu MySQL lub Oracle, należy wymienić odpowiednią funkcję; w pozostałych przypadkach najlepiej użyć COALESCE.
-- MySQL
SELECT IFNULL(bonus, 0) FROM employees;
-- Oracle
SELECT NVL(bonus, 0) FROM employees;
-- NVL2(bonus, 'has bonus', 'no bonus') -> if/else on NULLNULLIF: przeciwny kierunek
NULLIF(a, b) zwraca NULL, gdy a = b; w przeciwnym razie zwraca a. Celowo tworzy wartość NULL, czyli działa odwrotnie niż COALESCE.
Najbardziej znanym zastosowaniem jest ochrona przed dzieleniem przez zero. Należy opakować mianownik w NULLIF(denominator, 0): jeśli ma on wartość zero, dzielnik staje się NULL, a całe dzielenie zwraca NULL zamiast zgłaszać błąd.
-- Avoid divide-by-zero: returns NULL instead of erroring
SELECT revenue / NULLIF(orders, 0) AS avg_order_value
FROM daily_stats;
-- NULLIF(5, 5) -> NULL
-- NULLIF(5, 3) -> 5Łączenie NULLIF i COALESCE
Te dwie funkcje świetnie ze sobą współpracują. Klasyczny jednowierszowy idiom na rozmowie kwalifikacyjnej to „bezpieczne dzielenie, które pokazuje 0, gdy nie ma zamówień”. Należy użyć NULLIF, aby uniknąć błędu, a następnie COALESCE, aby zastąpić wynikowy NULL.
Ten zwięzły idiom świadczy o biegłości: obsługuje przypadek brzegowy i sposób prezentacji wyniku w jednym wyrażeniu.
SELECT
COALESCE(revenue / NULLIF(orders, 0), 0) AS avg_order_value
FROM daily_stats;
-- orders = 0 -> NULLIF gives NULL -> division gives NULL
-- -> COALESCE turns it into 0Traktowanie pustych ciągów jako NULL
Innym praktycznym zastosowaniem NULLIF jest zamiana pustych ciągów znaków na NULL, aby można było je jednolicie obsługiwać za pomocą COALESCE. Nieuporządkowane dane często mieszają NULL i ''; ten wzorzec normalizuje oba przypadki.
Należy odczytywać ten wzorzec jako: „jeśli wartość jest pusta, zamień ją na NULL, a następnie użyj wartości domyślnej”. To przejrzysta i przenośna odpowiedź na pytanie: „Jak traktować puste i brakujące wartości w ten sam sposób?”
-- Treat both '' and NULL as missing, default to 'Anonymous'
SELECT COALESCE(NULLIF(TRIM(username), ''), 'Anonymous')
FROM users;Głębszy przykład: COALESCE po złączeniach
Po wykonaniu LEFT JOIN niedopasowane wiersze generują wartości NULL po prawej stronie. COALESCE zamienia je na znaczące wartości domyślne w wyniku, co jest bardzo częstym wymaganiem w raportowaniu.
W tym przypadku klienci bez zamówień nadal są uwzględnieni dzięki LEFT JOIN, a ich suma jest wyświetlana jako 0 zamiast NULL. Wspomnienie, że COALESCE działa po złączeniu, a nie wewnątrz niego, pokazuje zrozumienie kolejności ewaluacji.
SELECT
c.name,
COALESCE(SUM(o.amount), 0) AS total_spent
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Customers with no orders get 0 instead of NULLNajważniejsze punkty na rozmowie
Podsumowanie zestawu narzędzi do zastępowania wartości:
- COALESCE(a, b, ...): pierwszy argument różny od NULL, wiele argumentów, standard ANSI, typ określany według priorytetu. Domyślny wybór.
- ISNULL / IFNULL / NVL: dwuargumentowe skróty dostawców; ISNULL może obciąć wynik do typu pierwszego argumentu.
- NULLIF(a, b): zwraca NULL, gdy argumenty są równe; świetnie nadaje się do ochrony przed dzieleniem przez zero i normalizacji pustych wartości.
- Połączenie
COALESCE(x / NULLIF(y, 0), 0)pozwala uzyskać bezpieczne i czytelne dzielenie.
Najpierw należy wymienić COALESCE, a warianty dostawców wspominać tylko wtedy, gdy dialekt jest określony.
Szybki test
Wybierz wyrażenie zapewniające bezpieczne dzielenie.
Podsumowanie
Można już zastępować wartości NULL i tworzyć wartości NULL:
- COALESCE zwraca pierwszy argument różny od NULL spośród wielu argumentów; jest przenośnym wyborem domyślnym.
- ISNULL (SQL Server), IFNULL (MySQL) i NVL (Oracle) to dwuargumentowe skróty; ISNULL może obciąć wynik do typu pierwszego argumentu.
- NULLIF(a, b) zwraca NULL, gdy obie wartości są równe; idealnie nadaje się do ochrony przed dzieleniem przez zero i normalizacji pustych ciągów znaków.
- Można je łączyć, aby tworzyć bezpieczne, czytelne wyrażenia i zastępować wartości NULL powstałe po LEFT JOIN wartościami domyślnymi.
Ostatnia lekcja: zachowanie NULL wewnątrz funkcji agregujących, złączeń i DISTINCT.
Często zadawane pytania
Czy lekcja „COALESCE, NULLIF i ISNULL” jest bezpłatna?
Tak — pełny tekst „COALESCE, NULLIF i ISNULL” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Coding Interview Prep, przejdź na CoddyKit PRO. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.
Co nauczysz się w „COALESCE, NULLIF i ISNULL”?
Podstawianie wartości domyślnych oraz różnice między COALESCE a funkcjami specyficznymi dla dostawcy Ćwiczysz Coding Interview Prep z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Coding Interview Prep?
Nie wymagamy żadnego doświadczenia. Coding Interview Prep w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „COALESCE, NULLIF i ISNULL”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Coding Interview Prep?
Tak. Każda lekcja Coding Interview Prep zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Logika trójwartościowa i UNKNOWN
- IS NULL, IS NOT NULL i porównywanie bezpieczne dla NULL
- COALESCE, NULLIF i ISNULL
- Wartości NULL w agregatach, złączeniach i DISTINCT