NULL w SQL w bazie Oracle oznaczona jest wartość która jest pusta lub nie ma znaczenia. Wartości null mogą pojawić się w kolumnach dowolnego typu danych, na które nie są nałożone ograniczenia NOT NULL lub kolumna nie jest oznaczona jako PRIMARY KEY. Null jest bardzo ważną wartością ponieważ wprowadza logikę trójwartościową. Użycie wartości null nie zawsze jest oczywiste i wymaga pewnej praktyki którą postaram się pokazać w poniższym wpisie. W kursie NULL w SQL opiszę zagadnienia:

  • Czym jest NULL w SQL
  • Rozpoznanie NULL
  • Operacje na NULL
  • funkcje NVL() i NVL2()

Powyższe pokażę na konkretnym przykładzie podstawowej bazy danych. W kolejnych kursach bazę tą będziemy wykorzystywać i rozszerzać o nowe elementy.

Ten kurs jest częścią cyklu Kurs SQL

Zapisz się na autorskie Szkolenie SQL

Czym jest NULL?

Null jest oznaczeniem wartości pustej lub wartości nieznanej. Nie jest to 0 w przypadku kolumny liczbowej (szczególny jest to pusty ciąg znakowy w przypadku tekstu ale o tym dalej). Każde wyrażenie arytmetyczne zawierające null zwraca wartość nieznaną czyli null (jedynym wyjątkiem jest tu konkatenacja/łączenie ciągów znakowych)

W SQL NULL nie powinien nigdy reprezentować jakiejkolwiek wartości.

Warunek, którego wynikiem jest NULL, działa podobnie jak FALSE. Na przykład instrukcja SELECT z warunkiem w klauzuli WHERE, którego wynikiem jest NULL, nie zwraca żadnych wierszy. Jednak warunek oceniany jako NULL różni się od FALSE tym, że dalsze operacje na ocenie stanu NULL będą oceniane jako NULL. Zatem NOT FALSE zwraca TRUE, ale NOT NULL – zwraca NULL 🙂 Czy zatem NULL i NOT NULL to to samo? Nie, bo NULL nie jest równy innemu NULLowi (choć są od tego odstępstwa np. w decode).

Jak widać logika z zachowaniem NULLa potrafi być zagmatwana. Poniżej postaram się pokazać które operacje jak działają z NULLami. Ważne jest, że null w różnych bazach a szczególnie językach programowania może zachowywać się inaczej.

Rozpoznanie NULL

Operacje na null nie zawsze są na pierwszy rzut oka intuicyjne to jednak po pewnym czasie pracy z nimi stają się bardziej przyjazne. Na wartościach null można wykonać wszystkie operacje jak na innych wartościach jednak zawsze(poza konkatenacją) wynikiem będzie null.

Pojawia się, więc pytanie jak odróżnić null od nulla lub jak rozpoznać, że null to null skoro null = null zwraca null? Oracle aby pomóc wprowadził dwa specjalne działania na wartościach NULL.

IS NULL

Operacja IS NULL pozwala nam rozpoznać, czy dana wartość to null. Operacja na kolumnie z warunkiem IS NULL zwróci true dla wartości NULL zgodnie z poniższym przykładem:

SELECT
    *
FROM DUAL
WHERE NULL IS NULL;

Oraz wynik:

is null

Tu małe wyjaśnienie czym jest tabela dual. Dual jest tabelą która ma jedną kolumnę, DUMMY, zdefiniowaną jako VARCHAR2 (1) i zawiera jeden wiersz z wartością X. Tabela ta występuje zawsze.

Skoro powyższe zapytanie zwrócił wynik “X” oznacza to, że w warunku WHERE mieliśmy wynik TRUE dla tego rekordu. W takim razie aby sprawdzić czy dana wartość jest null należy wykonać sprawdzenie IS NULL (nie null=null)

IS NOT NULL

Operacja IS NOT NULL pozwala nam rozpoznać, czy dana wartość NIE jest nullem. Operacja na kolumnie z warunkiem IS NOT NULL zwróci true dla wartości innych niż null zgodnie z poniższym przykładem:

SELECT
    *
FROM DUAL
WHERE NULL IS NOT NULL;

oraz wynik:

is not null

Jak widzimy powyżej wynik jest pusty co oznacza, w warunku WHERE wystąpiła wartość FALSE przez co tabela DUAL nie zwróciła żadnego rekordu. Warunek IS NOT NULL zwróci zawsze true dla wartości innej niż null oraz false dla wartości null.

Operacje na NULL

Wszystkie operacje poza konkatenacją oraz powyżej przedstawionymi ( IS NULL, IS NOT NULL) w połaczeniu z nullem zwracają NULL rozumianą nieraz jako wartość nieznaną. Poniżej przedstawiam tabelę która pozwala łatwiej zrozumieć kiedy w wyniku może pojawić się null:

OperacjaArgumentWynik
X IS NULLNULLTrue
X IS NULL100False
X IS NOT NULLNULLFalse
X IS NOT NULL100True
X = NULLNULLNULL
X <> NULLNULLNULL
X = 100NULLNULL
X <> 100NULLNULL
X + NULLNULLNULL
X + 100NULLNULL
X – 100NULLNULL
X > 100NULLNULL
X < NULLNULLNULL
X || ‘TEST’NULLTEST
X = 0NULLNULL
X = ”NULLNULL
X IS NULLTrue
X IS NOT NULLFalse
X = ”NULL
X <> ”NULL

Jak widać po powyższej tabeli należy być bardzo ostrożnym przy używaniu operacji z NULLem ponieważ większość z nich zwraca NULL.

Szczególnym przypadkiem jest pusty ciąg znaków jest traktowany przez bazę jako NULL.

Funkcje NVL i NVL2

Baza danych Oracle przygotowała kilka specjalnych funkcji do obsługi NULLi. W szczególności przydatne są dwie funkcje które pozwalają zastąpić wartość null jakąś wybraną.

NVL()

Funkcja NVL(wartość_1, wartość_2) jest funkcją przyjmującą dwie wartości. Jeżeli pierwsza wartość jest nullem funkcja zwróci drugą wartość. Jeżeli pierwsza wartość nie jest nullem funkcja zwróci pierwszą wartość.

Przykładowe użycie funkcji NVL może wyglądać jak poniżej:

SELECT
    nvl(null, 'test')
  , nvl('tekst1', 'tekst2')
  , nvl('', 'test')
  , nvl(0, 100)
FROM DUAL;

oraz wynik

nvl

Jak widzimy po powyższym baza zachowała się zgodnie z oczekiwaniem. Szczególnym przypadkiem w powyższym jest kolumna trzecia czyli NVL(”, ‘TEST’).

NVL2()

Rozwinięciem dwuargumentowej funkcji nvl() jest trójargumentowa funkcja NVL2(wartość_1, wartość_2, wartość_3) . W przypadku kiedy wartość_1 jest równa NULL to funkcja zwróci wartość_3, a gdy wartość_1 jest nierówna null to funkcja zwróci wartość_2. Zobaczmy przykładowe wykorzystanie funkcji nvl2()

SELECT
    nvl2(null, 'tekst1', 'tekst2')
  , nvl2('tekst1', 'tekst2', 'tekst3')
  , nvl2('', 'tekst1', 'tekst2')
  , nvl2(null, 0, 100)
  , nvl2(0, 10, 100)
FROM DUAL;

oraz wynik:

Jak widzimypo wyniku, funkcja zachowała się zgodnie z opisem.

Funkcję NVL oraz NVL2 wykorzystać można do bardziej czytelnej postaci wyniku np. aby zamiast null wyświetlić napis ‘Brak’

Podsumowanie

Wykorzystanie wartości null nie jest na pierwszy rzut oka oczywiste jednak jest bardzo przydatne i po pewnym czasie ciężko wyobrazić sobie bazy bez tej wartości. Samo stosowanie wartości null jest również ciekawie przedstawione w wikipedi. Z powyższego kursu dowiedziałeś się, że:

  • W SQL Null w bazie Oracle oznacza brak wartości lub pusty ciąg znaków
  • Do rozpoznania nulli wykorzystuje się operatory IS NULL oraz IS NOT NULL
  • Większość operacji z użyciem wartości null zwraca NULL.
  • Funkcje NVL() oraz NVL2() służą zastępowania wartości null
  • null nie równa się null więc null=null zwróci null
  • Jeżeli chcesz znaleźć więcej kursów dla średniozaawansowanych oraz poznać zasady optymalizacji zapytań zapoznaj się z pozostałymi kursami, sprawdź: Kurs Oracle SQL
  • Jeżeli chcesz poznać podstawy baz danych i kurs dla początkujących w SQL odwiedź Kurs SQL

2 komentarze

  1. Albo nie rozumiem logiki nvl2, albo jest błąd.
    “Rozwinięciem dwuargumentowej funkcji nvl() jest trójargumentowa funkcja NVL2(wartość_1, wartość_2, wartość_3) . W przypadku kiedy wartość_1 jest równa NULL to funkcja zwróci wartość_2, a gdy wartość_1 jest nierówna null to funkcja zwróci wartość_3. Zobaczmy przykładowe wykorzystanie funkcji nvl2()”
    To w powyższym przykładzie powinno zwrócić:
    tekst1, tekst2, tekst1, 0, 100
    a zwraca:
    tekst2, tekst2, tekst2, 100, 10

    jury

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *