Co je vlastně NULL?

Co je vlastně v SQL Serveru za hodnotu to NULL? Z pohledu Microsoft SQL Serveru je NULL popsána jako neznáma hodnota. Není to tedy nula [0], není to nic [], není to ani prázdný textový řetězec ['']. A z toho pak vyplývá i chování této hodnoty při porovnávání.
Tím, že jde o neznámou hodnotu, tedy něco, co nevím, co je, nemohu ani jednoznačně říct, jestli se NULL = NULL.

Například představme si následující tabulku osoby:

jmeno prijmeni
Petr Novák
(NULL) Pospíšil
Lucie Horká
Martin Starý
Jan Mladý
(NULL) Nováčková
Cibulka

V tabulce je uvedeno (NULL), aby bylo jisté, že nejde např. o prázdný řetězec – viz. poslední záznam

Budeme nyní chtít vybrat osoby, které nemají zadané Jméno a použijeme následující dotaz:

select * from osoby where jmeno = NULL

Tento dotaz nám vrátí 0 řádků a to přesto, že zcela evidentně existují osoby, mající hodnotu pole jmeno NULL.
Je to proto, že hodnota NULL je neznámá a nejde tak, říct, jestli se NULL v položce rovná NULL v dotazu. V SQL serveru se pro výběr hodnot NULL používá trochu jiný zápis.

select * from osoby where jmeno IS NULL

Což v podstatě říká, vyber záznamy z tabulky, jejichž hodnota pole jmeno je neznámá. Tento dotaz pak vrátí dva záznamy .

(NULL) Pospíšil
(NULL) Nováčková

Ekvivalentně bude fungovat i výběr osob, které hodnotu NULL v poli jmeno nemají:

select * from osoby where jmeno IS NOT NULL

Výsledkem bude:

Petr Novák
Lucie Horká
Martin Starý
Jan Mladý
Cibulka

Pro úplné vyjasnění můžeme ještě vybrat záznamy, kde je jmeno prázdný řetězec, resp. řetězec nulové délky.

select * from osoby where jmeno = ''

Výsledkem bude:

Cibulka

ANSI_NULL
Uvedené chování při porovnávání hodnoty NULL je v SQL Server standardní, nicméně je možné jej ovlivnit nastavením parametru ANSI_NULL. Parametr ANSI_NUL je standardně nastaven na ON a v tom případě se porovnání chová tak, jak je popsáno výše. Při nastavení parametru na OFF je chování při porovnání hodnoty NULL změněno tak, že platí NULL = NULL. Toto ovšem neodpovídá standardům a Microsoft v budoucích verzích (po SQL Server 2014) nebude změnu parametru na OFF umožňovat.

Komentáře nejsou povoleny.