IN (Transact-SQL)
Se aplica a: punto de conexión de SQL Server
Azure SQL Database
Azure SQL Instancia administrada
punto de conexión de SQL Analytics Analytics Platform System (PDW) de SQL Analytics
System (PDW)
de SQL Server en Microsoft Fabric
Warehouse en Microsoft Fabric
Determina si un valor especificado coincide con algún valor de una subconsulta o una lista.
Convenciones de sintaxis de Transact-SQL
Sintaxis
test_expression [ NOT ] IN
( subquery | expression [ ,...n ]
)
Nota:
Para ver la sintaxis de Transact-SQL para SQL Server 2014 (12.x) y versiones anteriores, consulte Versiones anteriores de la documentación.
Argumentos
test_expression
Es cualquier expresión válida.
subquery
Es una subconsulta que tiene un conjunto de resultados de una columna. Esta columna debe tener el mismo tipo de datos que test_expression.
expression[ ,... n ]
Es una lista de expresiones en la que se buscará una coincidencia. Todas las expresiones deben ser del mismo tipo que test_expression.
Tipos de resultado
Boolean
Valor del resultado
Si el valor de test_expression es igual a cualquier valor devuelto por subquery o si es igual a cualquier expression de la lista separada por comas, el valor devuelto es TRUE; en caso contrario, el valor del resultado es FALSE.
El uso de NOT IN niega el valor de subquery o de expression.
Precaución
Los valores NULL que devuelve subquery o expression comparados con test_expression por medio de IN o NOT IN devuelven UNKNOWN. La utilización de valores NULL con IN o NOT IN puede provocar resultados inesperados.
Observaciones
Si se incluye de manera explícita un número sumamente grande de valores (muchos miles de valores separados por comas) entre paréntesis en una cláusula IN, se pueden agotar los recursos y recibir los errores 8623 o 8632. Para evitar este problema, almacene los elementos de la lista IN en una tabla y use una subconsulta SELECT en una cláusula IN.
Error 8623:
The query processor ran out of internal resources and could not produce a query plan. This is a rare event and only expected for extremely complex queries or queries that reference a very large number of tables or partitions. Please simplify the query. If you believe you have received this message in error, contact Customer Support Services for more information.
Error 8632:
Internal error: An expression services limit has been reached. Please look for potentially complex expressions in your query, and try to simplify them.
Ejemplos
A. Comparar OR e IN
En el ejemplo siguiente se selecciona una lista con los nombres de los empleados que son ingenieros de diseño, ingenieros de herramientas o asistentes de marketing.
-- Uses AdventureWorks
SELECT p.FirstName, p.LastName, e.JobTitle
FROM Person.Person AS p
JOIN HumanResources.Employee AS e
ON p.BusinessEntityID = e.BusinessEntityID
WHERE e.JobTitle = 'Design Engineer'
OR e.JobTitle = 'Tool Designer'
OR e.JobTitle = 'Marketing Assistant';
GO
No obstante, con IN se recuperan los mismos resultados.
-- Uses AdventureWorks
SELECT p.FirstName, p.LastName, e.JobTitle
FROM Person.Person AS p
JOIN HumanResources.Employee AS e
ON p.BusinessEntityID = e.BusinessEntityID
WHERE e.JobTitle IN ('Design Engineer', 'Tool Designer', 'Marketing Assistant');
GO
Éste es el conjunto de resultados que se obtiene con cualquiera de las dos consultas.
FirstName LastName Title
--------- --------- ---------------------
Sharon Salavaria Design Engineer
Gail Erickson Design Engineer
Jossef Goldberg Design Engineer
Janice Galvin Tool Designer
Thierry D'Hers Tool Designer
Wanida Benshoof Marketing Assistant
Kevin Brown Marketing Assistant
Mary Dempsey Marketing Assistant
(8 row(s) affected)
B. Utilizar IN con una subconsulta
En el ejemplo siguiente se buscan todos los identificadores de vendedor de la tabla SalesPerson
para los empleados cuya cuota de ventas sea superior a 250.000 dólares al año y, después, se seleccionan en la tabla Employee
los nombres de todos los empleados cuyo EmployeeID
coincida con los resultados de la subconsulta SELECT
.
-- Uses AdventureWorks
SELECT p.FirstName, p.LastName
FROM Person.Person AS p
JOIN Sales.SalesPerson AS sp
ON p.BusinessEntityID = sp.BusinessEntityID
WHERE p.BusinessEntityID IN
(SELECT BusinessEntityID
FROM Sales.SalesPerson
WHERE SalesQuota > 250000);
GO
El conjunto de resultados es el siguiente:
FirstName LastName
--------- --------
Tsvi Reiter
Michael Blythe
Tete Mensa-Annan
(3 row(s) affected)
C. Utilizar NOT IN con una subconsulta
En el ejemplo siguiente se buscan los vendedores con una cuota inferior a 250.000 dólares. NOT IN
busca los vendedores que no coinciden con los elementos de la lista de valores.
-- Uses AdventureWorks
SELECT p.FirstName, p.LastName
FROM Person.Person AS p
JOIN Sales.SalesPerson AS sp
ON p.BusinessEntityID = sp.BusinessEntityID
WHERE p.BusinessEntityID NOT IN
(SELECT BusinessEntityID
FROM Sales.SalesPerson
WHERE SalesQuota > 250000);
GO
Ejemplos: Azure Synapse Analytics y Sistema de la plataforma de análisis (PDW)
D. Usar IN y NOT IN
En el siguiente ejemplo se encuentran todas las entradas de la tabla FactInternetSales
que coinciden con los valores de SalesReasonKey
de la tabla DimSalesReason
.
-- Uses AdventureWorks
SELECT * FROM FactInternetSalesReason
WHERE SalesReasonKey
IN (SELECT SalesReasonKey FROM DimSalesReason);
En el siguiente ejemplo se encuentran todas las entradas de la tabla FactInternetSalesReason
que no coinciden con los valores de SalesReasonKey
de la tabla DimSalesReason
.
-- Uses AdventureWorks
SELECT * FROM FactInternetSalesReason
WHERE SalesReasonKey
NOT IN (SELECT SalesReasonKey FROM DimSalesReason);
E. Usar IN con una lista de expresiones
En el siguiente ejemplo se encuentran todos los identificadores de los vendedores de la tabla DimEmployee
pertenecientes a aquellos empleados cuyo nombre es Mike
o Michael
.
-- Uses AdventureWorks
SELECT FirstName, LastName
FROM DimEmployee
WHERE FirstName IN ('Mike', 'Michael');
Consulte también
CASE (Transact-SQL)
Expresiones (Transact-SQL)
Funciones integradas (Transact-SQL)
Operadores (Transact-SQL)
SELECT (Transact-SQL)
WHERE (Transact-SQL)
ALL (Transact-SQL)
SOME | ANY (Transact-SQL)