Udostępnij za pomocą


JEST [NIE] RÓŻNA OD (Transact-SQL)

Dotyczy do: SQL Server 2022 (16.x) Azure SQL Database AzureSQL Managed InstanceSQL Analytics endpoint in Microsoft FabricWarehouse in Microsoft FabricSQL database in Microsoft Fabric

Porównuje równość dwóch wyrażeń i gwarantuje wynik true lub false, nawet jeśli jeden lub oba operandy mają wartość NULL.

IS [NOT] DISTINCT FROM to predykat używany w warunku wyszukiwania klauzul WHERE i klauzul HAVING , warunki sprzężenia klauzul FROM i inne konstrukcje, w których wymagana jest wartość logiczna.

Transact-SQL konwencje składni

Syntax

expression IS [NOT] DISTINCT FROM expression

Arguments

expression

Dowolne prawidłowe wyrażenie.

Wyrażenie może być kolumną, stałą, funkcją, zmienną, podzapytaniem skalarnym lub dowolną kombinacją nazw kolumn, stałych i funkcji połączonych przez operatory lub podzapytania.

Remarks

Porównanie wartości NULL z dowolną inną wartością, w tym inną wartością NULL, będzie miało nieznany wynik. IS [NOT] DISTINCT FROM zawsze zwraca wartość true lub false, ponieważ będzie traktować wartości NULL jako znane wartości, gdy są używane jako operator porównania.

W poniższej przykładowej tabeli użyto wartości A i B zilustrowano zachowanie funkcji IS [NOT] DISTINCT FROM:

A B A = B A NIE RÓŻNI SIĘ OD B
0 0 True True
0 1 False False
0 NULL Unknown False
NULL NULL Unknown True

Podczas wykonywania zapytania zawierającego element IS [NOT] DISTINCT FROM względem serwerów połączonych tekst zapytania wysyłany do serwera połączonego będzie się różnić w zależności od tego, czy serwer połączony ma możliwość analizowania składni.

Jeśli ustalimy, że połączony serwer może przeanalizować wartość IS [NOT] DISTINCT FROM, zdekodujemy składnię as-is. Jeśli nie możemy określić, że połączony serwer może przeanalizować is [NOT] DISTINCT FROM, zdekodujemy do następujących wyrażeń:

A IS DISTINCT FROM B spowoduje dekodowanie do: ((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 spowoduje dekodowanie do: (NOT (A <> B OR A IS NULL OR B IS NULL) OR (A IS NULL AND B IS NULL))

Examples

A. Używanie funkcji IS DISTINCT FROM

Poniższy przykład zwraca wiersze, w których id pole różni się od wartości całkowitej 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

Wyniki wykluczają wszystkie wiersze, w których id dopasowano wartość 17.

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

B. Użycie NIE JEST ODRĘBNE OD

Poniższy przykład zwraca wiersze, w których id pole nie różni się od wartości całkowitej 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

Wyniki zwracają tylko wiersze, w których id dopasowano wartość 17.

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

C. Użyj funkcji IS DISTINCT FROM względem wartości NULL

Poniższy przykład zwraca wiersze, w których id pole różni się od wartości 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

Wyniki zwracają tylko wiersze, w których id wartość nie była równa NULL.

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

D. Użyj funkcji IS NOT DISTINCT FROM względem wartości NULL

Poniższy przykład zwraca wiersze, w których id pole nie różni się od wartości 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

Wyniki zwracają tylko wiersze, w których id wartość miała wartość NULL.

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

Zobacz także