Serwisanci dostępni teraz · czynne całą dobę, także w weekendy i świętaWarszawa i okolice · dojazd bezpłatny
Darmowa diagnoza laptopa
Darmowa diagnoza laptopa
Dojazd do klienta bezpłatnie
Dojazd do klienta bezpłatnie
Laptopy zastępcze bezpłatnie
Laptopy zastępcze bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie

Funkcja ISNULL

Termin Definicja
Funkcja ISNULL

Funkcja ISNULL zastępuje wartość pustą (NULL) wskazaną wartością zastępczą.

Dwa argumenty i typ zwracanej wartości

ISNULL w dialekcie Transact-SQL przyjmuje dokładnie dwa argumenty: sprawdzane wyrażenie i wartość podstawianą, gdy to wyrażenie okaże się NULL. Zapis ISNULL(rabat, 0) w kolumnie liczbowej sprawia, że zamiast pustki w raporcie pojawi się zero, a sumowanie przestaje zwracać NULL dla całej grupy. Kluczowy szczegół, o którym łatwo zapomnieć: typ wyniku dziedziczony jest po pierwszym argumencie. Jeśli kolumna została zadeklarowana jako varchar(10), to ISNULL(nazwa, 'brak informacji o kliencie') zwróci ciąg przycięty do dziesięciu znaków, bez żadnego ostrzeżenia. Druga cecha, mniej oczywista, dotyczy dopuszczalności wartości pustej: wynik ISNULL jest przez silnik traktowany jako NOT NULL, co ma znaczenie przy kolumnach obliczanych, indeksach i kluczach.

Porównanie z COALESCE i NULLIF

COALESCE to odpowiednik zgodny ze standardem ANSI SQL, dostępny także w PostgreSQL, MySQL, Oracle czy SQLite. Przyjmuje dowolną liczbę argumentów i zwraca pierwszy niepusty, więc COALESCE(telefon_komorkowy, telefon_stacjonarny, telefon_firmowy, 'brak') załatwia jednym zapisem to, co przy ISNULL wymagałoby zagnieżdżania. COALESCE rozwija się wewnętrznie do konstrukcji CASE, przez co podzapytanie użyte jako argument bywa wykonywane więcej niż raz. Typ wyniku ustalany jest według priorytetu typów danych, a nie według pierwszego argumentu. NULLIF działa w drugą stronę: NULLIF(licznik, 0) zwraca NULL, gdy oba argumenty są równe, i jest najprostszym sposobem na uniknięcie dzielenia przez zero w wyrażeniu obrot / NULLIF(liczba_dni, 0). Warto pamiętać, że nazwa ISNULL w innych środowiskach oznacza zupełnie co innego: w MySQL ISNULL(x) zwraca 1 lub 0, a w Accessie IsNull() jest funkcją logiczną. Odpowiednikiem w Oracle jest NVL.

Pułapki przy migracji i w raportach

Najczęstsza awaria wygląda tak: kwerenda działała latami na SQL Server, po przeniesieniu bazy do PostgreSQL zwraca błąd o nieznanej funkcji, bo tam ISNULL po prostu nie istnieje. Drugi klasyk to milczące obcięcie tekstu opisane wyżej, wykrywane dopiero, gdy w wydruku faktury nazwa kontrahenta kończy się w połowie. Trzeci to mieszanie typów: ISNULL(data_zaplaty, 0) skompiluje się, bo zero da się rzutować na typ daty, i podstawi 1 stycznia 1900 zamiast czytelnej informacji o braku płatności. Osobna kategoria to porównania, w których ktoś próbuje pisać WHERE kolumna = NULL zamiast IS NULL, a potem łata to funkcją ISNULL po obu stronach warunku, blokując przy okazji wykorzystanie indeksu i zamieniając szybkie wyszukiwanie w pełny skan tabeli.

Kiedy zamiast poprawiania kwerendy trzeba zajrzeć głębiej

Bywa, że problem nie leży w składni, tylko w tym, że dane rzeczywiście są niekompletne, bo import z pliku CSV przerwał się w połowie albo aplikacja handlowa zapisuje puste pola zamiast zer. Warszawskie Pogotowie Komputerowe wdraża i serwisuje oprogramowanie handlowe, więc przy takich zgłoszeniach patrzymy nie tylko na zapytanie, ale na cały łańcuch: strukturę tabel, procedury importu, ustawienia instancji i kopie zapasowe. Pracujemy z klientami firmowymi całodobowo przez siedem dni w tygodniu, także wtedy, gdy raport ma być gotowy na poranne zamknięcie miesiąca.

+48 22 100 48 29Zadzwoń teraz · serwisant w 1 godzinę