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

Come funziona NULLIF() in SQL Server

In SQL Server, il NULLIF() espressione controlla il valore di due espressioni specificate. Restituisce un valore nullo se sono uguali, altrimenti restituisce la prima espressione.

Sintassi

La sintassi è questa:

NULLIF ( expression , expression )

Esempio

Ecco un esempio da dimostrare:

SELECT NULLIF(3, 3);

Risultato:

NULL

Qui, entrambe le espressioni sono uguali, quindi il risultato è un valore nullo.

Ecco cosa succede quando le espressioni non sono uguali:

SELECT NULLIF(3, 7);

Risultato:

3

Questa volta viene restituito il primo valore.

Ecco un esempio che racchiude entrambi i risultati:

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

Risultato:

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

Un esempio pratico

Supponiamo di avere una tabella con i seguenti dati:

SELECT 
    ProductName,
    ProductPrice
FROM Products;

Risultato:

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

E supponiamo di voler scoprire quanti prodotti hanno un prezzo positivo. In altre parole, non vogliamo includere prodotti che hanno un prezzo o zero o un valore nullo.

Per fare ciò, possiamo usare NULLIF() insieme a COUNT() funzione:

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

Risultato:

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

Otteniamo 5 come previsto, che è esattamente quante righe hanno un valore positivo nel ProductPrice colonna.

Funziona perché COUNT() la funzione conta solo valori non nulli. Convertendo gli importi zero in null, siamo in grado di ignorare quei valori nel nostro calcolo.

Eccolo di nuovo senza NULLIF() funzione.

SELECT COUNT(ProductPrice) AS Result
FROM Products;

Risultato:

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

Questa volta include gli importi zero e otteniamo 7. Ignora ancora la riga 6 perché in realtà ha un valore nullo.

Quando il primo argomento è la costante nulla

La funzione non accetta la costante nulla come primo argomento:

SELECT NULLIF(null, 3);

Risultato:

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.

Come afferma il messaggio di errore, il tipo del primo argomento deve essere noto. Il valore restituito dalla funzione utilizza il tipo di dati della prima espressione e questo errore riflette questo.

Questo errore dovrebbe essere abbastanza raro. Nella maggior parte dei casi, passerai il nome di una colonna come primo argomento e in SQL Server le colonne hanno un tipo di dati definito. In questi casi, verrà effettivamente accettato un valore nullo, poiché SQL Server conosce il tipo di dati della colonna.

Lo stesso si può dire per le variabili. Se passi una variabile, avresti dovuto dichiararne il tipo e, quindi, non avresti ricevuto l'errore.

Conteggio argomenti non valido

La chiamata della funzione senza passare alcun argomento genera un errore:

SELECT NULLIF();

Risultato:

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

E anche passare troppi argomenti provoca un errore:

SELECT NULLIF(1, 2, 3);

Risultato:

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