Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Fonctionnement de NULLIF() dans SQL Server

Dans SQL Server, le NULLIF() expression vérifie la valeur de deux expressions spécifiées. Il renvoie une valeur nulle s'ils sont égaux, sinon il renvoie la première expression.

Syntaxe

La syntaxe ressemble à ceci :

NULLIF ( expression , expression )

Exemple

Voici un exemple pour illustrer :

SELECT NULLIF(3, 3);

Résultat :

NULL

Ici, les deux expressions sont égales et le résultat est donc une valeur nulle.

Voici ce qui se passe lorsque les expressions ne sont pas égales :

SELECT NULLIF(3, 7);

Résultat :

3

Cette fois, la première valeur est renvoyée.

Voici un exemple qui résume les deux résultats :

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

Résultat :

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

Un exemple pratique

Supposons que nous ayons un tableau avec les données suivantes :

SELECT 
    ProductName,
    ProductPrice
FROM Products;

Résultat :

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

Et supposons que nous voulions savoir combien de produits ont un prix positif. En d'autres termes, nous ne voulons pas inclure les produits qui ont un prix ou une valeur nulle ou nulle.

Pour ce faire, nous pouvons utiliser NULLIF() en conjonction avec le COUNT() fonction :

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

Résultat :

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

Nous obtenons 5 comme prévu, ce qui correspond exactement au nombre de lignes ayant une valeur positive dans le ProductPrice colonne.

Cela fonctionne parce que le COUNT() la fonction ne compte que les valeurs non nulles. En convertissant les montants nuls en valeurs nulles, nous pouvons ignorer ces valeurs dans notre calcul.

Le voici à nouveau sans le NULLIF() fonction.

SELECT COUNT(ProductPrice) AS Result
FROM Products;

Résultat :

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

Cette fois, il inclut les montants nuls et nous obtenons 7. Il ignore toujours la ligne 6 car elle a en fait une valeur nulle.

Lorsque le premier argument est la constante nulle

La fonction n'accepte pas la constante nulle comme premier argument :

SELECT NULLIF(null, 3);

Résultat :

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.

Comme l'indique le message d'erreur, le type du premier argument doit être connu. La valeur de retour de la fonction utilise le type de données de la première expression, et cette erreur reflète cela.

Cette erreur devrait être assez rare. Dans la plupart des cas, vous passerez un nom de colonne comme premier argument, et dans SQL Server, les colonnes ont un type de données défini. Dans de tels cas, une valeur nulle sera en fait acceptée, car SQL Server connaît le type de données de la colonne.

On pourrait dire la même chose pour les variables. Si vous passiez une variable, vous auriez dû déclarer son type, et donc, vous n'obtiendriez pas l'erreur.

Nombre d'arguments non valides

L'appel de la fonction sans passer d'arguments entraîne une erreur :

SELECT NULLIF();

Résultat :

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

Et passer trop d'arguments provoque également une erreur :

SELECT NULLIF(1, 2, 3);

Résultat :

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