IS [NOT] DISTINCT FROM (Transact-SQL)

Aplica-se a: SQL Server 2022 (16.x) Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Ponto de extremidade de análise de SQL no Microsoft Fabric Warehouse 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