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