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