Záľudnosť funkcie IsNull

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)

Mohlo by ťa tiež zaujímať

Páčil sa ti príspevok?

Zdieľaj príspevok alebo si ho odlož na neskôr

Sleduj ma

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.