Partilhar via


É [NÃO] DISTINTA DE (Transact-SQL)

Aplica-se a: SQL Server 2022 (16.x) Azure SQL Database AzureSQL ManagedInstance SQL Analytics endpoint em Microsoft FabricWarehouse em Microsoft FabricSQL database em Microsoft Fabric

Compara a igualdade de duas expressões e garante um resultado verdadeiro ou falso, mesmo que um ou ambos os operandos sejam NULL.

É [NÃO] DISTINTO DE é um predicado usado na condição de pesquisa de cláusulas WHERE e cláusulas HAVE , as condições de junção de cláusulas FROM e outras construções onde um valor booleano é necessário.

Transact-SQL convenções de sintaxe

Syntax

expression IS [NOT] DISTINCT FROM expression

Arguments

expression

Qualquer expressão 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 coluna, constantes e funções conectadas por um operador ou operadores, ou uma subconsulta.

Remarks

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 usado como um operador de comparação.

A tabela de exemplo a seguir usa valores A e B para ilustrar o comportamento de IS [NOT] DISTINTO DE:

A B A = B A NÃO É DISTINTO DE B
0 0 True True
0 1 False False
0 NULL Unknown False
NULL NULL Unknown True

Ao executar uma consulta que contém IS [NOT] DISTINCT FROM em relação aos servidores vinculados, o texto da consulta enviado para o servidor vinculado varia, dependendo se podemos 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 as-is. Se não pudermos determinar que um servidor vinculado pode analisar IS [NOT] DISTINCT FROM, decodificaremos para as seguintes expressões:

A IS DISTINCT FROM B irá descodificar 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 irá descodificar para: (NOT (A <> B OR A IS NULL OR B IS NULL) OR (A IS NULL AND B IS NULL))

Examples

A. A utilização É DISTINTA DA

O exemplo a seguir retorna linhas em que o id campo é 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 onde id correspondeu ao valor de 17.

id          message
----------- ---------
NULL        hello
10          NULL
NULL        NULL

B. A utilização NÃO É DISTINTA DA

O exemplo a seguir retorna linhas em que o id campo 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 o id correspondeu ao valor de 17.

id          message
----------- --------
17          abc
17          yes

C. Use É DISTINTO DE em relação a um valor NULL

O exemplo a seguir retorna linhas em que o id campo é diferente 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 onde o id não era NULL.

id          message
----------- --------
10          NULL
17          abc
17          yes

D. Use NÃO É DISTINTO DE em relação a um valor NULL

O exemplo a seguir retorna linhas em que o id campo 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 onde o id foi NULL.

id          message
----------- --------
NULL        hello
NULL        NULL

Consulte também