MS Access - Predikát IS NULL

19. 12. 2012, Vladimír Klaus, přečteno 3696x

MS Access
SQL

Pomocí tohoto predikátu můžete pracovat s hodnotou, která neexistuje – nebyla vyplněna. Ona to tedy vlastně ani není hodnota, o čemž se dozvíte v části Co to je NULL.

Zkusme si třeba zjistit, zda máme nějaké zákazníky, kteří zapomněli vyplnit příjmení.

SELECT * FROM Zakaznici WHERE Prijmeni IS NULL

Ale ano, jeden zákazník tu opravdu je…

SQL obrázek

Alternativou k výše uvedenému dotazu je tento, využívající funkci IsNull().

SELECT * FROM Zakaznici WHERE IsNull(Prijmeni)

Tento predikát můžeme dále kombinovat s klíčovým slovem NOT, tedy dostaneme opačný výsledek. Tato zjistíme objednávky, které mají vyplněné datum a zároveň jsou vyřízené.

SELECT * FROM Objednavky
WHERE Datum IS NOT NULL AND Vyrizeno = True

SQL obrázek

Všimněte si prosím, že ve výše uvedeném příkladu nemůžeme použít podmínku, ve které by se porovnávalo datum s prázdným řetězcem! Datum není textový řetězec a test na to, zda je vyplněno se takto realizovat opravdu nedá.

SELECT * FROM Objednavky WHERE Datum<>""

A nakonec ještě dokonalejší a trochu složitější dotaz – objednávky, které mají vyplněné datum a jsou od zákazníků, kteří mají vyplněná příjmení.

SELECT * FROM Objednavky
INNER JOIN Zakaznici
ON Objednavky.IdZakaznika = Zakaznici.ID
WHERE Objednavky.Datum IS NOT NULL AND Zakaznici.Prijmeni IS NOT NULL

SQL obrázek

Upozornění: Je třeba dávat velký pozor na práci s těmito hodnotami, protože v některých případech se vůbec nedají použít (například spojovat podle toho tabulky), jindy nám zcela znehodnotí dotaz, který vrátí více či méně nesmyslné výsledky apod.

Rozdíl mezi neexistující a prázdnou hodnotou

Další nebezpečí číhá v tom, že nevyplněná hodnota není (nemusí být) totéž jako hodnota, která byla vyplněna, ale byla smazána. Taková hodnota je pak prázdná.

Jak si toto představit v nějakém reálném příkladu? Je to stejné, jako byste měli založený bankovní účet a na něm nic neměli (hodnota je prázdná). To ale stále umožňuje na tento účet nějaké peníze poslat. Ale ve chvíli, kdy účet vůbec neexistuje, je z tohoto pohledu situace zcela odlišná (peníze není kam poslat).

Je zřejmé, že v praxi není často vůbec důležité, zda hodnota neexistuje (nikdy nebyla zadána) nebo byla jen vymazána (a je prázdná). Vždy si ověřte, že váš dotaz funguje z tohoto pohledu zcela transparentně.