Dela via


ÄR [INTE] SKILD FRÅN (Transact-SQL)

Gäller för: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed InstanceSQL Analytics-slutpunkt i Microsoft FabricWarehouse i Microsoft FabricSQL Database i Förhandsversion av Microsoft Fabric

Jämför likheten mellan två uttryck och garanterar ett sant eller falskt resultat, även om en eller båda operanderna är NULL.

IS [NOT] DISTINCT FROM är ett predikat som används i sökvillkoret för WHERE-satser och HAVING-satser , kopplingsvillkoren för FROM-satser och andra konstruktioner där ett booleskt värde krävs.

Transact-SQL syntaxkonventioner

Syntax

expression IS [NOT] DISTINCT FROM expression

Arguments

expression

Valfritt giltigt uttryck.

Uttrycket kan vara en kolumn, en konstant, en funktion, en variabel, en skalär underfråga eller en kombination av kolumnnamn, konstanter och funktioner som är anslutna av en operator eller operator eller en underfråga.

Remarks

Om du jämför ett NULL-värde med andra värden, inklusive ett annat NULL, får du ett okänt resultat. IS [NOT] DISTINCT FROM returnerar alltid sant eller falskt, eftersom det behandlar NULL-värden som kända värden när de används som jämförelseoperator.

I följande exempeltabell används värden A och B för att illustrera beteendet för IS [NOT] DISTINCT FROM:

A B A = B A SKILJER SIG INTE FRÅN B
0 0 True True
0 1 False False
0 NULL Unknown False
NULL NULL Unknown True

När du kör en fråga som innehåller IS [NOT] DISTINCT FROM mot länkade servrar varierar frågetexten som skickas till den länkade servern, beroende på om vi kan fastställa att den länkade servern har möjlighet att parsa syntaxen.

Om vi fastställer att den länkade servern kan parsa ÄR [INTE] DISTINKT FRÅN, avkodar vi syntaxen as-is. Om vi inte kan fastställa att en länkad server kan parsa ÄR [INTE] DISTINKT FRÅN, avkodar vi till följande uttryck:

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

Examples

A. Användning SKILJER SIG FRÅN

I följande exempel returneras rader där fältet id skiljer sig från heltalsvärdet 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

Resultatet exkluderar alla rader där id värdet 17 matchades.

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

B. Användning SKILJER SIG INTE FRÅN

I följande exempel returneras rader där fältet id inte skiljer sig från heltalsvärdet 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

Resultatet returnerar endast de rader där det id matchade värdet 17.

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

C. Använd IS DISTINCT FROM mot ett NULL-värde

I följande exempel returneras rader där fältet id skiljer sig från 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

Resultatet returnerar endast de rader där id var inte NULL.

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

D. Använd ÄR INTE DISTINKT FRÅN mot ett NULL-värde

I följande exempel returneras rader där fältet id inte skiljer sig från 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

Resultatet returnerar endast de rader där id var NULL.

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

See also