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