sql >> Databasteknik >  >> RDS >> Sqlserver

Hur NULLIF() fungerar i SQL Server

I SQL Server, NULLIF() expression kontrollerar värdet av två angivna uttryck. Den returnerar ett nullvärde om de är lika, annars returnerar den det första uttrycket.

Syntax

Syntaxen ser ut så här:

NULLIF ( expression , expression )

Exempel

Här är ett exempel att visa:

SELECT NULLIF(3, 3);

Resultat:

NULL

Här är båda uttrycken lika, så resultatet är ett nollvärde.

Så här händer när uttrycken inte är lika:

SELECT NULLIF(3, 7);

Resultat:

3

Den här gången returneras det första värdet.

Här är ett exempel som kapslar in båda resultaten:

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   |
+------+------+-----+-----+

Ett praktiskt exempel

Anta att vi har en tabell med följande 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)

Och anta att vi vill ta reda på hur många produkter som har ett positivt pris. Med andra ord vill vi inte inkludera produkter som har ett pris eller noll eller nollvärde.

För att göra detta kan vi använda NULLIF() i kombination 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 förväntat, vilket är exakt hur många rader som har ett positivt värde i ProductPrice kolumn.

Detta fungerar eftersom COUNT() funktion räknar endast icke-nullvärden. Genom att konvertera nollbeloppen till null kan vi ignorera dessa värden i vår beräkning.

Här är det igen utan NULLIF() funktion.

SELECT COUNT(ProductPrice) AS Result
FROM Products;

Resultat:

+----------+
| Result   |
|----------|
| 7        |
+----------+
Warning: Null value is eliminated by an aggregate or other SET operation.

Den här gången inkluderar den nollbeloppen och vi får 7. Den ignorerar fortfarande rad 6 eftersom den faktiskt har ett nollvärde.

När det första argumentet är nollkonstanten

Funktionen accepterar inte nollkonstanten som dess första 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 felmeddelandet anger måste typen av det första argumentet vara känd. Funktionens returvärde använder datatypen för det första uttrycket, och det här felet återspeglar det.

Detta fel bör vara ganska sällsynt. I de flesta fall skickar du ett kolumnnamn som det första argumentet, och i SQL Server har kolumner en definierad datatyp. I sådana fall kommer ett null-värde faktiskt att accepteras, på grund av att SQL Server känner till kolumnens datatyp.

Detsamma kan sägas om variabler. Om du skickar en variabel, skulle du ha behövt deklarera dess typ, och därför skulle du inte få felet.

Ogiltigt antal argument

Att anropa funktionen utan att skicka några argument resulterar i ett fel:

SELECT NULLIF();

Resultat:

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near ')'.

Och att skicka för många argument orsakar också ett fel:

SELECT NULLIF(1, 2, 3);

Resultat:

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near ','.

  1. Vad och när ska jag ange setFetchSize()?

  2. Hur byter man databaser i postgres?

  3. Hur man ansluter Python till SQL Server för att automatisera backendprocessen

  4. Infoga data och ställ in främmande nycklar med Postgres