IS [NOT] DISTINCT FROM (Transact-SQL)

Si applica a: SQL Server 2022 (16.x) database SQL di Azure Istanza gestita di SQL di Azure endpoint di analisi SQL in Microsoft Fabric Warehouse in Microsoft Fabric

Confronta l'uguaglianza di due espressioni e garantisce un risultato true o false, anche se uno o entrambi gli operandi sono NULL.

IS [NOT] DISTINCT FROM è un predicato usato nella condizione di ricerca delle clausole WHERE e HAVING, nelle condizioni di join delle clausole FROM e in altri costrutti in cui è necessario un valore booleano.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

expression IS [NOT] DISTINCT FROM expression

Argomenti

expression

Qualsiasi espressione valida.

L'espressione può essere una colonna, una costante, una funzione, una variabile, una sottoquery scalare oppure qualsiasi combinazione di nomi di colonna, costanti e funzioni connessi da uno o più operatori oppure da una sottoquery.

Osservazioni:

Il confronto di un valore NULL con qualsiasi altro valore, incluso un altro valore NULL, genera un risultato sconosciuto. IS [NOT] DISTINCT FROM restituirà sempre true o false, perché considererà i valori NULL come valori noti quando viene usato come operatore di confronto.

Nella tabella di esempio seguente si usano valori A e B per illustrare il comportamento di IS [NOT] DISTINCT FROM:

Un G A = B A IS NOT DISTINCT FROM B
0 0 Vero Vero
0 1 Falso Falso
0 NULL Sconosciuto Falso
NULL NULL Sconosciuto Vero

Quando si esegue una query contenente IS [NOT] DISTINCT FROM su server collegati, il testo della query inviato al server collegato varia a seconda che sia possibile o meno determinare che il server collegato include la funzionalità per analizzare la sintassi.

Se si determina che il server collegato può analizzare IS [NOT] DISTINCT FROM, la sintassi verrà decodificata così come è. Se non è possibile determinare che il server collegato può analizzare IS [NOT] DISTINCT FROM, la sintassi verrà decodificata nelle espressioni seguenti:

A IS DISTINCT FROM B verrà decodificato 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 verrà decodificato in (NOT (A <> B OR A IS NULL OR B IS NULL) OR (A IS NULL AND B IS NULL))

Esempi

R. Usare IS DISTINCT FROM

Nell'esempio seguente vengono restituite le righe in cui il campo id è distinto dal valore intero 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

I risultati escludono tutte le righe in cui id corrisponde al valore 17.

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

B. Usare IS NOT DISTINCT FROM

Nell'esempio seguente vengono restituite le righe in cui il campo id non è distinto dal valore intero 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

I risultati restituiscono solo le righe in cui id corrisponde al valore 17.

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

C. Usare IS DISTINCT FROM con un valore NULL

Nell'esempio seguente vengono restituite le righe in cui il campo id è distinto da 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

I risultati restituiscono solo le righe in cui id non è NULL.

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

D. Usare IS NOT DISTINCT FROM con un valore NULL

Nell'esempio seguente vengono restituite le righe in cui il campo id non è distinto da 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

I risultati restituiscono solo le righe in cui id è NULL.

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

Vedi anche