IS [NOT] DISTINCT FROM (Transact-SQL)

Se aplica a: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed InstancePunto de conexión de análisis SQL en Microsoft FabricAlmacenamiento en Microsoft Fabric

Compara la igualdad de dos expresiones y garantiza un resultado verdadero o falso, incluso si uno o ambos operandos son NULL.

IS [NOT] DISTINCT FROM es un predicado que se usa en la condición de búsqueda de las cláusulas WHERE y HAVING, en las condiciones de combinación de las cláusulas FROM y en otras construcciones que requieren un valor booleano.

Convenciones de sintaxis de Transact-SQL

Sintaxis

expression IS [NOT] DISTINCT FROM expression

Argumentos

expression

Cualquier expression válida.

La expresión puede ser una columna, una constante, una función, una variable, una subconsulta escalar o cualquier combinación de nombres de columna, constantes y funciones conectados mediante uno o varios operadores o una subconsulta.

Observaciones

La comparación de un valor NULL con cualquier otro valor, incluido otro NULL, generará un resultado desconocido. IS [NOT] DISTINCT FROM siempre devolverá true o false, ya que tratará los valores NULL como valores conocidos cuando se usen como operador de comparación.

En la tabla de ejemplo siguiente se usan valores A y B para ilustrar el comportamiento de IS [NOT] DISTINCT FROM:

A B A = B A IS NOT DISTINCT FROM B
0 0 True True
0 1 False False
0 NULL Desconocido False
NULL NULL Unknown True

Al ejecutar una consulta que contiene IS [NOT] DISTINCT FROM en servidores vinculados, el texto de consulta enviado al servidor vinculado variará en función de si podemos determinar que el servidor vinculado tiene la capacidad de analizar la sintaxis.

Si determinamos que el servidor vinculado puede analizar IS [NOT] DISTINCT FROM, descodificaremos la sintaxis tal como está. Si no podemos determinar que el servidor vinculado puede analizar IS [NOT] DISTINCT FROM, decodificaremos a las siguientes expresiones:

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

Ejemplos

A. Usar IS DISTINCT FROM

En el ejemplo siguiente se devuelven filas donde el campo id es distinto del valor entero 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

Los resultados excluyen todas las filas donde id coincide con el valor de 17.

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

B. Usar IS NOT DISTINCT FROM

En el ejemplo siguiente se devuelven filas donde el campo id no es distinto del valor entero 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

Los resultados devuelven solo las filas donde id coincide con el valor de 17.

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

C. Usar IS DISTINCT FROM en un valor NULL

En el ejemplo siguiente se devuelven filas donde el campo id es 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

Los resultados devuelven solo las filas donde id no era NULL.

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

D. Usar IS NOT DISTINCT FROM en un valor NULL

En el ejemplo siguiente se devuelven filas donde el campo id no es 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

Los resultados devuelven solo las filas donde id era NULL.

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

Vea también