Condividi tramite


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 nel database SQL di Microsoft Fabric 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