IS [NOT] DISTINCT FROM (Transact-SQL)
S’applique à : point de terminaison d’analyse SQL Server 2022 (16.x) Azure SQL Database Azure SQL Managed Instance SQL dans Microsoft Fabric Warehouse
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.
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;
DROP TABLE IF EXISTS #SampleTempTable;
GO
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.
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;
DROP TABLE IF EXISTS #SampleTempTable;
GO
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.
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;
DROP TABLE IF EXISTS #SampleTempTable;
GO
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.
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;
DROP TABLE IF EXISTS #SampleTempTable;
GO
Les résultats retournent uniquement les lignes où id
était NULL.
id message
----------- --------
NULL hello
NULL NULL