IS [NOT] DISTINCT FROM (Transact-SQL)

S’applique à : SQL Server 2022 (16.x) Azure SQL Managed Instance

Compare l’égalité de deux expressions et garantit un résultat vrai ou faux, même si un ou les deux opérandes sont Null.

IS [NOT] DISTINCT FROM est un prédicat utilisé dans la condition de recherche des clauses WHERE et HAVING, dans les conditions de jointure des clauses FROM ainsi que dans d’autres constructions où une valeur booléenne est nécessaire.

Conventions de la syntaxe Transact-SQL

Syntaxe

expression IS [NOT] DISTINCT FROM expression

Arguments

expression

Toute expression valide.

L’expression ne peut pas être une colonne, constante, fonction, variable, sous-requête scalaire ou toute combinaison de noms de colonnes, de constantes et de fonctions reliées par un ou plusieurs opérateurs ou par une sous-requête.

Remarques

La comparaison d’une valeur NULL à toute autre valeur, y compris une autre valeur NULL, aura un résultat inconnu. IS [NOT] DISTINCT FROM retourne toujours true ou false, car il traite les valeurs NULL comme des valeurs connues lorsqu’elles sont utilisées comme opérateur de comparaison.

L’exemple de table suivant utilise des valeurs A et B illustre le comportement de IS [NOT] DISTINCT FROM :

A B A = B A IS NOT DISTINCT FROM B
0 0 True True
0 1 False False
0 NULL Unknown False
NULL NULL Unknown True

Lors de l’exécution d’une requête qui contient IS [NOT] DISTINCT FROM sur des serveurs liés, le texte de requête envoyé au serveur lié varie selon que nous pouvons déterminer si le serveur lié a la possibilité d’analyser la syntaxe.

Si nous déterminons que le serveur lié peut analyser IS [NOT] DISTINCT FROM, nous décoderons la syntaxe telle quelle. Si nous ne pouvons pas déterminer qu’un serveur lié peut analyser IS [NOT] DISTINCT FROM, nous allons décoder les expressions suivantes :

A IS DISTINCT FROM B décodé sur : ((A <> B OR A IS NULL OR B IS NULL) AND NOT (A IS NULL AND B IS NULL))

A IS NOT DISTINCT FROM B décodé sur : (NOT (A <> B OR A IS NULL OR B IS NULL) OR (A IS NULL AND B IS NULL))

Exemples

R. Utiliser IS DISTINCT FROM

L’exemple suivant retourne des lignes où le champ id est distinct de la valeur entière de 17.

USE tempdb;
GO
DROP TABLE IF EXISTS #SampleTempTable;
GO
CREATE TABLE #SampleTempTable (id INT, message nvarchar(50));
INSERT INTO #SampleTempTable VALUES (null, 'hello') ;
INSERT INTO #SampleTempTable VALUES (10, null);
INSERT INTO #SampleTempTable VALUES (17, 'abc');
INSERT INTO #SampleTempTable VALUES (17, 'yes');
INSERT INTO #SampleTempTable VALUES (null, null);
GO

SELECT * FROM #SampleTempTable WHERE id IS DISTINCT FROM 17;

Les résultats excluent toutes les lignes où id correspond à la valeur 17.

id          message
----------- ---------
NULL        hello
10          NULL
NULL        NULL

B. Utiliser IS NOT DISTINCT FROM

L’exemple suivant retourne des lignes où le champ id est distinct de la valeur entière de 17.

USE tempdb;
GO
DROP TABLE IF EXISTS #SampleTempTable;
GO
CREATE TABLE #SampleTempTable (id INT, message nvarchar(50));
INSERT INTO #SampleTempTable VALUES (null, 'hello') ;
INSERT INTO #SampleTempTable VALUES (10, null);
INSERT INTO #SampleTempTable VALUES (17, 'abc');
INSERT INTO #SampleTempTable VALUES (17, 'yes');
INSERT INTO #SampleTempTable VALUES (null, null);
GO

SELECT * FROM #SampleTempTable WHERE id IS NOT DISTINCT FROM 17;

Les résultats retournent uniquement les lignes où id correspond à la valeur 17.

id          message
----------- --------
17          abc
17          yes

C. Utiliser IS DISTINCT FROM par rapport à une valeur NULL

L’exemple suivant retourne des lignes où le champ id est distinct de la valeur NULL.

USE tempdb;
GO
DROP TABLE IF EXISTS #SampleTempTable;
GO
CREATE TABLE #SampleTempTable (id INT, message nvarchar(50));
INSERT INTO #SampleTempTable VALUES (null, 'hello') ;
INSERT INTO #SampleTempTable VALUES (10, null);
INSERT INTO #SampleTempTable VALUES (17, 'abc');
INSERT INTO #SampleTempTable VALUES (17, 'yes');
INSERT INTO #SampleTempTable VALUES (null, null);
GO

SELECT * FROM #SampleTempTable WHERE id IS DISTINCT FROM NULL;

Les résultats retournent uniquement les lignes où id n’était pas NULL.

id          message
----------- --------
10          NULL
17          abc
17          yes

D. Utiliser IS NOT DISTINCT FROM par rapport à une valeur NULL

L’exemple suivant retourne des lignes où le champ id n’est pas distinct de la valeur NULL.

USE tempdb;
GO
DROP TABLE IF EXISTS #SampleTempTable;
GO
CREATE TABLE #SampleTempTable (id INT, message nvarchar(50));
INSERT INTO #SampleTempTable VALUES (null, 'hello') ;
INSERT INTO #SampleTempTable VALUES (10, null);
INSERT INTO #SampleTempTable VALUES (17, 'abc');
INSERT INTO #SampleTempTable VALUES (17, 'yes');
INSERT INTO #SampleTempTable VALUES (null, null);
GO

SELECT * FROM #SampleTempTable WHERE id IS NOT DISTINCT FROM NULL;

Les résultats retournent uniquement les lignes où id était NULL.

id          message
----------- --------
NULL        hello
NULL        NULL

Voir aussi