- 08/29/2016
- 4 minutos para leer
-
- c
- j
- r
- M
- i
-
+5
Se aplica a: SQL Server (todas las versiones compatibles) Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Parallel Data Warehouse
Determina si un valor especificado coincide con cualquier valor de una subconsulta o una lista.
Convenciones de sintaxis de Transact-SQL
Sintaxis
test_expression IN ( subquery | expression )
Nota
Para ver la sintaxis de Transact-SQL para SQL Server 2014 y anteriores, consulte la documentación de las versiones anteriores.
Argumentos
expresión_de_prueba
Es cualquier expresión válida.
subconsulta
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
Es una lista de expresiones para probar 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 la subconsulta o es igual a cualquier expresión de la lista separada por comas, el valor del resultado es TRUE; en caso contrario, el valor del resultado es FALSE.
Usar NOT IN niega el valor de la subconsulta o la expresión.
Cualquier valor nulo devuelto por la subconsulta o la expresión que se compare con test_expression usando IN o NOT IN devuelve UNKNOWN. El uso de valores nulos junto con IN o NOT IN puede producir resultados inesperados.
Observaciones
Incluir explícitamente un número extremadamente grande de valores (muchos miles de valores separados por comas) dentro de los paréntesis, en una cláusula IN puede consumir recursos y devolver errores 8623 o 8632. Para solucionar este problema, almacene los elementos de la lista IN en una tabla y utilice una subconsulta SELECT dentro de 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. Comparando OR e IN
El siguiente ejemplo selecciona una lista de los nombres de los empleados que son ingenieros de diseño, diseñadores 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
Sin embargo, se obtienen los mismos resultados utilizando IN.
-- 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
Aquí se muestra el conjunto de resultados de ambas 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. Usando IN con una subconsulta
El siguiente ejemplo encuentra todos los ID de los vendedores de la tabla SalesPerson
de los empleados que tienen una cuota de ventas superior a 250.000 dólares en el año, y luego selecciona de la tabla Employee
los nombres de todos los empleados donde EmployeeID
que coinciden 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
Aquí está el conjunto de resultados.
FirstName LastName --------- -------- Tsvi Reiter Michael Blythe Tete Mensa-Annan (3 row(s) affected)
C. Uso de NOT IN con una subconsulta
El siguiente ejemplo encuentra los vendedores que no tienen una cuota superior a 250.000 dólares. NOT IN
encuentra 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 Parallel Data Warehouse
D. Uso de IN y NOT IN
El siguiente ejemplo encuentra 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);
El siguiente ejemplo encuentra 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. Uso de IN con una lista de expresiones
El siguiente ejemplo encuentra todos los ID de los vendedores de la tabla DimEmployee
para los empleados que tienen un nombre que es Mike
o Michael
.
-- Uses AdventureWorks SELECT FirstName, LastName FROM DimEmployee WHERE FirstName IN ('Mike', 'Michael');
Vea también
CASE (Transact-SQL)
Expresiones (Transact-SQL)
Funciones incorporadas (Transact-SQL)
Operadores (Transact-SQL)
SELECT (Transact-SQL)
WHERE (Transact-SQL)
ALL (Transact-SQL)
SOME | ANY (Transact-SQL)