Megosztás a következőn keresztül:


[NOT] DISTINCT FROM (Transact-SQL)

Vonatkozik a következőkre: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed InstanceSQL analytics endpoint in Microsoft FabricWarehouse in Microsoft Fabric SQLdatabase in Microsoft Fabric

Két kifejezés egyenlőségét hasonlítja össze, és igaz vagy hamis eredményt garantál, még akkor is, ha az egyik vagy mindkét operandus NULL.

AZ IS [NOT] DISTINCT FROM a WHERE záradékok és HAVING záradékok keresési feltételében, a FROM záradékok illesztési feltételeiben és más olyan szerkezetekben használt predikátum, ahol logikai értékre van szükség.

Transact-SQL szintaxis konvenciók

Syntax

expression IS [NOT] DISTINCT FROM expression

Arguments

expression

Bármilyen érvényes kifejezés.

A kifejezés lehet oszlop, állandó, függvény, változó, skaláris allekérdezés, vagy egy operátor vagy operátor által összekapcsolt oszlopnevek, állandók és függvények bármilyen kombinációja, vagy egy allekérdezés.

Remarks

Ha összehasonlít egy NULL értéket bármely más értékkel, beleértve egy másik NULL értéket is, ismeretlen eredményt fog kapni. AZ IS [NOT] DISTINCT FROM függvény mindig igaz vagy hamis értéket ad vissza, mivel a NULL értékeket ismert értékekként fogja kezelni, ha összehasonlító operátorként használják.

Az alábbi mintatábla az értékeket A használja, és B az IS [NOT] DISTINCT FROM viselkedését szemlélteti:

A B A = B AZ A NEM KÜLÖNBÖZIK A B-TŐL
0 0 True True
0 1 False False
0 NULL Unknown False
NULL NULL Unknown True

Ha olyan lekérdezést hajt végre, amely [NEM] KÜLÖNBÖZik a csatolt kiszolgálóktól, a csatolt kiszolgálónak küldött lekérdezés szövege eltérő lesz attól függően, hogy meg tudjuk-e állapítani, hogy a csatolt kiszolgáló képes-e elemezni a szintaxist.

Ha azt állapítjuk meg, hogy a csatolt kiszolgáló elemezni tudja az IS [NOT] DISTINCT FROM függvényt, akkor dekódoljuk a szintaxist as-is. Ha nem tudjuk megállapítani, hogy egy csatolt kiszolgáló nem tudja elemezni az IS [NOT] DISTINCT FROM függvényt, a következő kifejezésekre fogunk kódolni:

A IS DISTINCT FROM B dekódolja a következőre: ((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 dekódolja a következőre: (NOT (A <> B OR A IS NULL OR B IS NULL) OR (A IS NULL AND B IS NULL))

Examples

A. A használat ELTÉR A KÖVETKEZŐTŐL:

Az alábbi példa olyan sorokat ad vissza, amelyekben a id mező különbözik a 17 egész szám értékétől.

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

Az eredmények kizárnak minden olyan sort, amely id megfelel a 17-nek.

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

B. A használat NEM KÜLÖNBÖZIK A KÖVETKEZŐTŐL:

Az alábbi példa olyan sorokat ad vissza, amelyekben a id mező nem különbözik a 17 egész szám értékétől.

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

Az eredmények csak azokat a sorokat adnak vissza, ahol a id 17-nek megfelelő érték felel meg.

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

C. AZ IS DISTINCT FROM használata NULL értékhez

Az alábbi példa olyan sorokat ad vissza, amelyekben a mező különbözik a id NULL értéktől.

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

Az eredmények csak azokat a sorokat adnak vissza, amelyekben nem id NULL érték volt.

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

D. AZ IS NOT DISTINCT FROM használata NULL értékhez

Az alábbi példa olyan sorokat ad vissza, amelyekben a id mező nem különbözik a NULL értéktől.

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

Az eredmények csak azokat a sorokat adnak vissza, ahol a id null érték volt.

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

Lásd még