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 Warehouse 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

Siehe auch