I SQL Server er NULLIF()
udtryk kontrollerer værdien af to angivne udtryk. Det returnerer en nulværdi, hvis de er ens, ellers returnerer det det første udtryk.
Syntaks
Syntaksen ser sådan ud:
NULLIF ( expression , expression )
Eksempel
Her er et eksempel til demonstration:
SELECT NULLIF(3, 3);
Resultat:
NULL
Her er begge udtryk ens, og resultatet er derfor en nulværdi.
Her er, hvad der sker, når udtrykkene ikke er ens:
SELECT NULLIF(3, 7);
Resultat:
3
Denne gang returneres den første værdi.
Her er et eksempel, der indkapsler begge resultater:
SELECT
NULLIF(0, 0) AS a,
NULLIF(3, 3) AS b,
NULLIF(3, 0) AS c,
NULLIF(0, 3) AS d;
Resultat:
+------+------+-----+-----+ | a | b | c | d | |------+------+-----+-----| | NULL | NULL | 3 | 0 | +------+------+-----+-----+
Et praktisk eksempel
Antag, at vi har en tabel med følgende data:
SELECT
ProductName,
ProductPrice
FROM Products;
Resultat:
+-------------------------------------+----------------+ | ProductName | ProductPrice | |-------------------------------------+----------------| | Left handed screwdriver | 25.99 | | Long Weight (blue) | 14.75 | | Long Weight (green) | 11.99 | | Smash 2000 Sledgehammer | 0.00 | | Chainsaw (includes 3 spare fingers) | 0.00 | | Straw Dog Box | NULL | | Bottomless Coffee Mugs (4 Pack) | 9.99 | | Right handed screwdriver | 25.99 | +-------------------------------------+----------------+ (8 rows affected)
Og antag, at vi gerne vil finde ud af, hvor mange produkter der har en positiv pris. Med andre ord ønsker vi ikke at inkludere produkter, der har en pris eller nul eller en nulværdi.
For at gøre dette kan vi bruge NULLIF()
i forbindelse med COUNT()
funktion:
SELECT
COUNT(NULLIF(ProductPrice, 0.00)) AS Result
FROM Products;
Resultat:
+----------+ | Result | |----------| | 5 | +----------+ Warning: Null value is eliminated by an aggregate or other SET operation.
Vi får 5 som forventet, hvilket er præcis hvor mange rækker der har en positiv værdi i ProductPrice
kolonne.
Dette virker, fordi COUNT()
funktion tæller kun ikke-nul værdier. Ved at konvertere nul-beløbene til null, er vi i stand til at ignorere disse værdier i vores beregning.
Her er den igen uden NULLIF()
funktion.
SELECT COUNT(ProductPrice) AS Result
FROM Products;
Resultat:
+----------+ | Result | |----------| | 7 | +----------+ Warning: Null value is eliminated by an aggregate or other SET operation.
Denne gang inkluderer den nulbeløbene, og vi får 7. Den ignorerer stadig række 6, fordi den faktisk har en nulværdi.
Når det første argument er nulkonstanten
Funktionen accepterer ikke null-konstanten som dens første argument:
SELECT NULLIF(null, 3);
Resultat:
Msg 4151, Level 16, State 1, Line 1 The type of the first argument to NULLIF cannot be the NULL constant because the type of the first argument has to be known.
Som fejlmeddelelsen angiver, skal typen af det første argument være kendt. Funktionens returværdi bruger datatypen for det første udtryk, og denne fejl afspejler det.
Denne fejl burde være ret sjælden. I de fleste tilfælde sender du et kolonnenavn som det første argument, og i SQL Server har kolonner en defineret datatype. I sådanne tilfælde vil en null-værdi faktisk blive accepteret, på grund af det faktum, at SQL Server kender kolonnens datatype.
Det samme kan siges om variabler. Hvis du sender en variabel, ville du have skullet erklære dens type, og du ville derfor ikke få fejlen.
Ugyldigt antal argumenter
Kaldning af funktionen uden at sende nogen argumenter resulterer i en fejl:
SELECT NULLIF();
Resultat:
Msg 102, Level 15, State 1, Line 1 Incorrect syntax near ')'.
Og at sende for mange argumenter medfører også en fejl:
SELECT NULLIF(1, 2, 3);
Resultat:
Msg 102, Level 15, State 1, Line 1 Incorrect syntax near ','.