Publikoval Michal Kočí dňa 9.11.2006 o 00:18 v kategórii SQL
Dnes som sa trochu napálil a potrápil som sa s SQL dotazom. Zradu som nakoniec našiel, spôsobila ju funkcia IsNull.
Funkcia IsNull preberá dva parametre - prvý je hodnota, ktorá je funkciou vrátená, ak nie je NULL. Ak táto hodnota je NULL, potom je vrátená hodnota druhého parametra. Táto funkcia je veľmi užitočná, napríklad ak potrebujete spočítať alebo sčítať dva stĺpce, ktoré môžu obsahovať aj hodnotu NULL. Napríklad ak máte stĺpce Cena1 a Cena2 a potrebujete ich spočítať, tak použijete:
SELECT Cena1 + Cena2 AS CenaCelkom FROM Tabulka
Ak by však hodnoty v týchto stĺpcoch mohli nadobúdať hodnoty NULL, potom použijete funkciu IsNull, takto:
SELECT IsNull(Cena1, 0) + IsNull(Cena2, 0) AS CenaCelkom FROM Tabulka
Funkcia ozaj užitočná. Kde však u mňa nastala zrada? Funkcia IsNull totiž vracia hodnotu rovnakého dátového typu ako je prvý parameter funkcie. No a v mojom prípade to bol typ bit. A ja som potreboval, aby ak stĺpec obsahuje hodnotu 0 alebo 1 nech mi ju vráti, ale ak obsahuje hodnotu NULL tak nech mi vráti hodnotu -1. Problém však je, že funkcia IsNull mi hodnotu -1 v prípade že prvý parameter bol NULL nevrátila, ale vrátila mi hodnotu 1.
Teda, nasledovný príklad vráti korektne hodnotu 1:
DECLARE @b bit SELECT @b = 1 SELECT IsNull(@b, -1)
Nasledovný príklad korektne hodnotu 0:
DECLARE @b bit SELECT @b = 0 SELECT IsNull(@b, -1)
Zrada nastane ak sa jedná o hodnotu NULL a nasledovný príklad preto vráti hodnotu 1 namiesto na prvý pohľad očakávanej hodnoty -1:
DECLARE @b bit SELECT @b = NULL SELECT IsNull(@b, -1)
No ale ak parameter pretypujeme najskôr na int, potom funkcia IsNull vráti očakávanú hodnotu -1:
DECLARE @b bit SELECT @b = NULL SELECT IsNull(CAST(@b as int), -1)
Ak nechceš premeškať príspevky ako je tento, sleduj ma na Twitteri, alebo ak máš RSS čítačku, môžeš sledovať môj RSS kanál.