IS [NOT] DISTINCT FROM (Transact-SQL)
Gilt für: SQL Server 2022 (16.x) Azure SQL-Datenbank Azure SQL verwaltete Instanz SQL Analytics-Endpunkt in Microsoft Fabric Warehouse in Microsoft Fabric SQL-Datenbank in Microsoft Fabric SQL-Datenbank in Microsoft Fabric
Vergleicht die Gleichheit zweier Ausdrücke und garantiert das Ergebnis TRUE oder FALSE, auch wenn einer oder beide Operanden NULL sind.
IS [NOT] DISTINCT FROM ist ein Prädikat, das in der Suchbedingung von WHERE-Klauseln und HAVING-Klauseln sowie in den Verknüpfungsbedingung von FROM-Klauseln und in anderen Konstrukten verwendet wird, in denen ein boolescher Wert erforderlich ist.
Transact-SQL-Syntaxkonventionen
Syntax
expression IS [NOT] DISTINCT FROM expression
Argumente
expression
Beliebiger gültiger Ausdruck.
Der Ausdruck kann ein Spaltenname, eine Konstante, Funktion, Variable, skalare Unterabfrage oder Kombination aus Spaltennamen, Konstanten und Funktionen sein, die durch Operatoren oder eine Unterabfrage miteinander verbunden sind.
Hinweise
Der Vergleich eines NULL-Werts mit einem beliebigen anderen Wert, einschließlich eines anderen NULL-Werts, führt zu einem unbekannten Ergebnis. IS [NOT] DISTINCT FROM gibt stets TRUE oder FALSE zurück, da es NULL-Werte als bekannte Werte behandelt, wenn es als Vergleichsoperator verwendet wird.
In der folgenden Beispieltabelle werden die Werte A
und B
verwendet, um das Verhalten von IS [NOT] DISTINCT FROM zu veranschaulichen:
A | B | A = B | A IS NOT DISTINCT FROM B |
---|---|---|---|
0 | 0 | True | True |
0 | 1 | False | False |
0 | NULL | Unbekannt | False |
NULL | NULL | Unbekannt | True |
Wenn Sie eine Abfrage, die IS [NOT] DISTINCT FROM enthält, auf verknüpfte Server anwenden, variiert der an den verknüpften Server gesendete Abfragetext, je nachdem, ob wir feststellen können, dass der verknüpfte Server die Fähigkeit hat, die Syntax zu analysieren.
Wenn wir feststellen, dass der verknüpfte Server IS [NOT] DISTINCT FROM analysieren kann, decodieren wir die Syntax so, wie sie ist. Wenn wir nicht feststellen können, dass ein verknüpfter Server IS [NOT] DISTINCT FROM analysieren kann, erfolgt eine Decodierung in die folgenden Ausdrücke:
A IS DISTINCT FROM B
wird decodiert in: ((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
wird decodiert in: (NOT (A <> B OR A IS NULL OR B IS NULL) OR (A IS NULL AND B IS NULL))
Beispiele
A. Verwenden von IS DISTINCT FROM
Das folgende Beispiel gibt Zeilen zurück, in denen sich das Feld id
vom Ganzzahlwert 17 unterscheidet.
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
In den Ergebnissen werden alle Zeilen ausgeschlossen, in denen id
mit dem Wert 17 übereinstimmt.
id message
----------- ---------
NULL hello
10 NULL
NULL NULL
B. Verwenden von IS NOT DISTINCT FROM
Im folgenden Beispiel werden Zeilen zurückgegeben, in denen sich das Feld id
nicht vom Ganzzahlwert 17 unterscheidet.
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
Im Ergebnis werden nur die Zeilen angezeigt, in denen id
mit dem Wert 17 übereinstimmt.
id message
----------- --------
17 abc
17 yes
C. Verwenden von IS DISTINCT FROM für einen NULL-Wert
Das folgende Beispiel gibt Zeilen zurück, in denen sich das Feld id
von NULL unterscheidet.
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
Die Ergebnisse geben nur die Zeilen zurück, in denen id
nicht NULL war.
id message
----------- --------
10 NULL
17 abc
17 yes
D. Verwenden von IS NOT DISTINCT FROM für einen NULL-Wert
Das folgende Beispiel gibt Zeilen zurück, in denen sich das Feld id
nicht von NULL unterscheidet.
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
Die Ergebnisse geben nur die Zeilen zurück, in denen id
NULL war.
id message
----------- --------
NULL hello
NULL NULL