IS [NOT] DISTINCT FROM (Transact-SQL)
Aplica-se a: SQL Server 2022 (16.x) Banco de Dados SQL do Azure Ponto de extremidade de análise de SQL da Instância Gerenciada de SQL do Azure no Microsoft Fabric Warehouse no Microsoft Fabric Banco de dados SQL no Microsoft Fabric
Compara a igualdade de duas expressões e garante um resultado true ou false, mesmo que um ou ambos os operandos sejam NULL.
IS [NOT] DISTINCT FROM é um predicado usado no critério de pesquisa das cláusulas WHERE e HAVING, nas condições de junção das cláusulas FROM e em outras construções em que um valor booliano é necessário.
Convenções de sintaxe de Transact-SQL
Sintaxe
expression IS [NOT] DISTINCT FROM expression
Argumentos
expressão
Qualquer expression válida.
A expressão pode ser uma coluna, uma constante, uma função, uma variável, uma subconsulta escalar ou qualquer combinação de nomes de colunas, constantes e funções conectadas por um operador ou operadores ou por uma subconsulta.
Comentários
Comparar um valor NULL com qualquer outro valor, incluindo outro NULL, terá um resultado desconhecido. IS [NOT] DISTINCT FROM sempre retornará true ou false, pois tratará valores NULL como valores conhecidos quando usados como um operador de comparação.
A tabela de exemplo a seguir usa os valores A
e B
para ilustrar o comportamento de IS [NOT] DISTINCT FROM:
Um | B | A = B | A IS NOT DISTINCT FROM B |
---|---|---|---|
0 | 0 | True | True |
0 | 1 | Falso | Falso |
0 | NULO | Unknown | Falso |
NULO | NULO | Unknown | verdadeiro |
Ao executar uma consulta que contém IS [NOT] DISTINCT FROM em servidores vinculados, o texto da consulta enviado ao servidor vinculado variará em função de ser possível determinar se o servidor vinculado tem a capacidade de analisar a sintaxe.
Se determinarmos que o servidor vinculado pode analisar IS [NOT] DISTINCT FROM, decodificaremos a sintaxe como está. Se não pudermos determinar se um servidor vinculado pode analisar IS [NOT] DISTINCT FROM, decodificaremos para as seguintes expressões:
A IS DISTINCT FROM B
decodificará para: ((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
decodificará para: (NOT (A <> B OR A IS NULL OR B IS NULL) OR (A IS NULL AND B IS NULL))
Exemplos
a. Usar IS DISTINCT FROM
O exemplo a seguir retorna linhas em que o campo id
é distinto do valor inteiro de 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
Os resultados excluem todas as linhas em que id
correspondeu ao valor de 17.
id message
----------- ---------
NULL hello
10 NULL
NULL NULL
B. Usar IS NOT DISTINCT FROM
O exemplo a seguir retorna linhas em que o campo id
não é distinto do valor inteiro de 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
Os resultados retornam apenas as linhas em que id
correspondeu ao valor de 17.
id message
----------- --------
17 abc
17 yes
C. Usar IS DISTINCT FROM em relação a um valor NULL
O exemplo a seguir retorna linhas em que o campo id
é distinto de 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
Os resultados retornam apenas as linhas em que id
não era NULL.
id message
----------- --------
10 NULL
17 abc
17 yes
D. Usar IS NOT DISTINCT FROM em relação a um valor NULL
O exemplo a seguir retorna linhas em que o campo id
não é distinto de 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
Os resultados retornam apenas as linhas em que id
era NULL.
id message
----------- --------
NULL hello
NULL NULL