IS [NOT] DISTINCT FROM (Transact-SQL)
Se aplica a: Sql Server 2022 (16.x) Punto de conexión de Azure SQL Database Azure SQL Instancia administrada SQL Analytics en Microsoft Fabric Warehouse en la base de datos SQL de Microsoft Fabric 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