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

Gérer les valeurs NULL dans SQL Server

C'est quoi NUL ? NULL ou le marqueur NULL est la façon dont nous représentons une valeur inconnue dans SQL, par SQL, je fais référence au langage de requête structuré standard, et non à MS SQL Server. La dernière phrase nous ramène un peu en 1969 lorsque la norme a été définie pour la première fois par le Dr E.F. Codd. NULL devient nécessaire parce que nous devons penser en termes de ce qu'on appelle la logique des prédicats à trois valeurs. Un prédicat est la propriété d'une expression qui est vraie ou non. À première vue, on penserait à deux possibilités :VRAI ou FAUX. Cependant, il existe une troisième possibilité :INCONNU.

Prenons un exemple. En supposant qu'un attribut (colonne) dans notre relation (Table) représente le numéro d'identification fiscale (TIN) d'un ensemble de propriétaires de petites entreprises à Accra, au Ghana. La colonne de l'enregistrement de chaque propriétaire d'entreprise sera remplie avec son TIN et nous pouvons utiliser cette colonne pour déterminer un autre attribut, par exemple s'il est à jour dans les paiements de taxes. Cependant, il existe deux possibilités supplémentaires dans ce cas d'utilisation :

  1. Le propriétaire de l'entreprise a un TIN et est à jour.
  2. Le propriétaire de l'entreprise n'a pas de TIN et n'est (évidemment) pas à jour.

Ce qui précède décrit ce que le Dr Codd a appelé la logique des prédicats à quatre valeurs. La norme SQL, cependant, simplifie ces deux conditions supplémentaires en la définissant comme inconnue, c'est-à-dire NULL. Nous ne connaissons pas le TIN du propriétaire de l'entreprise et ne pouvons déterminer aucune autre valeur à partir de l'attribut du propriétaire de l'entreprise concerné. Ainsi, NULL est UNKNOWN et est la troisième valeur dans la logique de prédicat standard à trois valeurs.

NULL est spécial

La définition de NULL nécessite le traitement du marqueur d'une manière différente des valeurs réelles. Voici des exemples :

  1. Le filtre "WHERE =NULL ;" n'existe pas. L'expression correcte serait "WHERE IS NULL ;". Il en va de même pour l'expression inverse.
  2. Lors du tri par ordre croissant SQL, vous pouvez choisir de lister les valeurs NULL en premier ou en dernier. La valeur par défaut est de lister les NULL en premier.
  3. Vous ne pouvez pas comparer les valeurs NULL. Cela devrait être évident puisque nous avons dit que NULL est UNKNOWN.
  4. Lorsqu'une tentative de concaténation implique une colonne NULL, le résultat est NULL.

Fonctions communes liées à NULL

Voici trois fonctions courantes liées à NULL dans SQL Server

EST NULL

ISNULL – Remplace NULL par une valeur de remplacement spécifiée. Le Listing 1 et la Fig 1 montrent des exemples simples de ISNULL.

-- Listing 1: Simple Example of ISSNULL
SELECT ISNULL (NULL, 3) NULLREPLACEMENT;
SELECT ISNULL (NULL,'GREEN') NULLREPLACEMENT;
SELECT ISNULL (NULL,'2018-12-25') NULLREPLACEMENT;

Fig 1 :Exemple simple de ISNULL

NULLIF

NULLIF renvoie NULL est la valeur des deux arguments sont égaux.

-- Listing 2: Simple Example of NULLIF
SELECT NULLIF(3,3) AS NULLIFF;
SELECT NULLIF(3,5) AS NULLIFF;
SELECT NULLIF('RED','RED') AS NULLIFF;
SELECT NULLIF('GREEN','RED') AS NULLIFF;

Fig. 2 :Exemple simple de NULLIF

COALESCER

COALESCE renvoie la première valeur non NULL de la liste fournie. Le Listing 1 en montre des exemples et la Fig 1 montre le résultat des requêtes.

-- Listing 3: Simple Example of COALESCE
SELECT COALESCE (NULL,'','GREEN','','') AS NULLRESPONSE;
SELECT COALESCE (NULL,'GREEN','HOPE','') AS NULLRESPONSE;
SELECT COALESCE (1,'','GREEN','','') AS NULLRESPONSE;

Fig 3 :Exemple simple de coalescence

Notez que ces exemples simples exposent à l'utilisation la nature de NULL. NULL et l'espace vide ne sont PAS les mêmes. Dans la première instruction, COALESCE renvoie un espace vide nous indiquant qu'un espace vide est la première valeur non NULL de la liste.

Différences entre ISNULL et COALESCE

Les différences entre ISNULL et COALESCE ont fait l'objet de plusieurs articles en ligne ainsi que de livres tels que ceux répertoriés dans la section des références. Ces différences sont résumées comme suit :

  1. ISNULL est la propriété de SQL Server tandis que COALESCE est une fonction standard ANSI. Cela implique que pour la portabilité, COALESCE est préféré.
  2. ISNULL ne prend que deux arguments tandis que COALESCE peut prendre plus de deux arguments.
  3. Le type de données de la valeur renvoyée par ISNULL est déterminé par le type de données du premier argument tandis que le type de données de la valeur renvoyée par COALESCE est déterminé par le type de données dans la liste avec la priorité la plus élevée.
  4. Lorsque les deux fonctions sont utilisées avec des sous-requêtes, ISNULL fonctionne mieux car COALESCE est traduit en interne en une expression CASE, ce qui a tendance à répéter les analyses.

Itzik Ben-Gan explore également d'autres implications de la conversion de COALESCE en une expression de cas dans son article dont le lien est fourni à la fin de cet article.

Exemples de cas d'utilisation

Nous souhaitons afficher sur un portail Web la liste des clients en fonction de certains critères du tableau que nous créons dans la liste 4. Les tâches 1 et 2 donnent des exigences possibles et nous utilisons ISNULL et COALESCE pour répondre aux exigences.

--Listing 4: Table Creation Script
CREATE TABLE CUSTOMER 
(ID INT IDENTITY (1,1)
,FIRSTNAME VARCHAR(50)
,LASTNAME VARCHAR(50)
,SEX CHAR(1)
,ADDRESS VARCHAR(300)
,FIRSTTRANDATE DATETIME
,PHONENUMBER1 BIGINT
,PHONENUMBER2 BIGINT
,PHONENUMBER3 BIGINT);
GO

INSERT INTO CUSTOMER VALUES ('KENNETH','IGIRI','M','ACCRA, GHANA',GETDATE(),'0245335678','0555335678',NULL);
INSERT INTO CUSTOMER VALUES ('RICHARD','HANO','M','BUDAPEST, HUNGARY',GETDATE(),'889189400122',NULL,NULL);
INSERT INTO CUSTOMER VALUES ('GEORGINA','APPIAH','F','ACCRA, GHANA','09-16-2018','02456665678','0275339678',NULL);
INSERT INTO CUSTOMER VALUES ('HOWARD','KLEVIA',NULL,'HAGUE, SWITZERLAND','02-16-2017','3499285782',NULL,NULL);
INSERT INTO CUSTOMER VALUES ('ZEN','GREGOR',NULL,'SHANGHAI, CHINA','06-23-2018','0245335678','0555335678',NULL);
INSERT INTO CUSTOMER VALUES ('IHEOMA','AWA','F','LAGOS, NIGERIA',GETDATE(),'0245335678','0555335678',NULL);

Fig. 4 Exemple de tableau

Tâche 1 :renvoie la liste de tous les clients qui n'ont pas fourni d'autre numéro de téléphone.

--Listing 5: Table List of Customers with no Secondary Phones
--A: The Simple Answer
SELECT * FROM CUSTOMER WHERE PHONENUMBER2 IS NULL ;

--B: Presenting the Result Set Better
SELECT 
FIRSTNAME
,LASTNAME
,ADDRESS
,FIRSTTRANDATE
,PHONENUMBER1 AS [PRIMARY PHONE NUMBER]
,ISNULL(CAST(PHONENUMBER2 AS VARCHAR), 'NO SECONDARY PHONE') AS [SECONDARY PHONE NUMBER]
FROM CUSTOMER WHERE PHONENUMBER2 IS NULL ;

En utilisant COALESCE (ou ISNULL), nous pouvons mieux présenter les informations requises en utilisant un texte indiquant "Pas de téléphone secondaire".

Fig. 5 Ensemble de résultats pour le Listing 5

Tâche 2 :Renvoie la liste de tous les clients, leur numéro de téléphone principal, et tout autre numéro de téléphone alternatif.

--Listing 6: Table List of Customers with an Other Alternate Number
SELECT 
FIRSTNAME
,LASTNAME
,ADDRESS
,FIRSTTRANDATE
,PHONENUMBER1 AS [PRIMARY PHONE NUMBER]
,COALESCE(CAST(PHONENUMBER2 AS VARCHAR),CAST(PHONENUMBER3 AS VARCHAR), 'NO OTHER PHONE') AS [OTHER PHONE NUMBER]
FROM CUSTOMER  ;

Fig. 6 Ensemble de résultats pour le Listing 6

Dans ce cas, ISNULL n'est pas une option puisque nous passons trois arguments.

Conclusion

Dans cet article, nous avons abordé le concept de NULL en ce qui concerne la logique de prédicat à trois valeurs et décrit les fonctions populaires que nous utilisons dans SQL Server pour traiter les ensembles de données contenant des valeurs NULL. Nous avons également vu des exemples d'utilisation de ces fonctions. De nombreuses autres références approfondissent l'utilisation, les avantages et les limites de ces fonctions. Je recommanderais vivement les livres et les blogs d'Itzik Ben-Gan comme de bonnes sources d'information.

Références

  • NULLIF (Transact-SQL)
  • COALESCE (Transact-SQL)
  • Article d'Itzik Ben-Gan