IS [NOT] DISTINCT FROM (Transact-SQL)
Aplica-se a: SQL Server 2022 (16.x) Banco de Dados SQL do AzureInstância Gerenciada de SQL do AzurePonto de extremidade de análises SQL no Microsoft FabricWarehouse 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
Confira também
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários