sql >> Database >  >> RDS >> Sqlserver

Hoe NULLIF() werkt in SQL Server

In SQL Server, de NULLIF() expressie controleert de waarde van twee opgegeven expressies. Het retourneert een null-waarde als ze gelijk zijn, anders wordt de eerste expressie geretourneerd.

Syntaxis

De syntaxis gaat als volgt:

NULLIF ( expression , expression )

Voorbeeld

Hier is een voorbeeld om te demonstreren:

SELECT NULLIF(3, 3);

Resultaat:

NULL

Hier zijn beide uitdrukkingen gelijk, en dus is het resultaat een null-waarde.

Dit is wat er gebeurt als de uitdrukkingen niet gelijk zijn:

SELECT NULLIF(3, 7);

Resultaat:

3

Deze keer wordt de eerste waarde geretourneerd.

Hier is een voorbeeld dat beide uitkomsten samenvat:

SELECT 
    NULLIF(0, 0) AS a,
    NULLIF(3, 3) AS b,
    NULLIF(3, 0) AS c,
    NULLIF(0, 3) AS d;

Resultaat:

+------+------+-----+-----+
| a    | b    | c   | d   |
|------+------+-----+-----|
| NULL | NULL | 3   | 0   |
+------+------+-----+-----+

Een praktisch voorbeeld

Stel dat we een tabel hebben met de volgende gegevens:

SELECT 
    ProductName,
    ProductPrice
FROM Products;

Resultaat:

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

En stel dat we willen weten hoeveel producten een positieve prijs hebben. Met andere woorden, we willen geen producten opnemen met een prijs of nul- of nulwaarde.

Om dit te doen, kunnen we NULLIF() . gebruiken in combinatie met de COUNT() functie:

SELECT 
    COUNT(NULLIF(ProductPrice, 0.00)) AS Result
FROM Products;

Resultaat:

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

We krijgen 5 zoals verwacht, wat precies is hoeveel rijen een positieve waarde hebben in de ProductPrice kolom.

Dit werkt omdat de COUNT() functie telt alleen niet-null-waarden. Door de nulbedragen om te zetten in null, kunnen we die waarden in onze berekening negeren.

Hier is het weer zonder de NULLIF() functie.

SELECT COUNT(ProductPrice) AS Result
FROM Products;

Resultaat:

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

Deze keer bevat het de nulbedragen en krijgen we 7. Het negeert rij 6 nog steeds omdat dat eigenlijk een null-waarde heeft.

Als het eerste argument de nulconstante is

De functie accepteert de nulconstante niet als het eerste argument:

SELECT NULLIF(null, 3);

Resultaat:

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.

Zoals de foutmelding aangeeft, moet het type van het eerste argument bekend zijn. De retourwaarde van de functie gebruikt het gegevenstype van de eerste uitdrukking, en deze fout geeft dat weer.

Deze fout zou vrij zeldzaam moeten zijn. In de meeste gevallen geeft u een kolomnaam door als eerste argument en in SQL Server hebben kolommen een gedefinieerd gegevenstype. In dergelijke gevallen wordt een null-waarde daadwerkelijk geaccepteerd, omdat SQL Server het gegevenstype van de kolom kent.

Hetzelfde kan gezegd worden voor variabelen. Als je een variabele doorgeeft, zou je het type moeten declareren en daarom zou je de fout niet krijgen.

Ongeldig aantal argumenten

Het aanroepen van de functie zonder het doorgeven van argumenten resulteert in een fout:

SELECT NULLIF();

Resultaat:

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

En het doorgeven van te veel argumenten veroorzaakt ook een fout:

SELECT NULLIF(1, 2, 3);

Resultaat:

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

  1. DBCC CLONEDATABASE gebruiken om een ​​schema en alleen statistieken te genereren van een gebruikersdatabase in SQL Server 2014 SP2

  2. Oracle NULLIF() functie

  3. Best practice voor paginering in Oracle?

  4. Hoe schema's gebruiken in Django?