sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan NULLIF() virker i SQL Server

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 ','.

  1. Trin for trin opgraderingsproces til R12.2 Upgrade part -2 (Main Upgrade Driver for R12.2.0)

  2. Hvorfor er der huller i min IDENTITY-kolonneværdier?

  3. SQL-serverlogforsendelse og installation og konfiguration -4

  4. uønsket ledende tomrum på orakelnummerformat