IN (Transact-SQL)
Determina si un valor especificado coincide con algún valor de una subconsulta o una lista.
Sintaxis
test_expression [ NOT ] IN
( subquery | expression [ ,...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 expression.
Advertencia |
---|
Los valores NULL que devuelve subquery o expression comparados con test_expression mediante IN o NOT IN devuelven UNKNOWN. La utilización de valores NULL con IN o NOT IN puede provocar resultados inesperados. |
Notas
Si se incluye un número sumamente grande de valores (muchos miles) en una cláusula IN, se pueden agotar los recursos y obtenerse los errores 8623 o 8632. Para evitar este problema, almacene los elementos de la lista IN en una tabla.
Error 8623:
El procesador de consultas se quedó sin recursos internos y no pudo producir un plan de consulta. Esto ocurre en raras ocasiones y sólo se espera en consultas extremadamente complejas o consultas que hacen referencia a un número muy grande de tablas o particiones. Simplifique la consulta. Si cree que ha recibido este mensaje por error, póngase en contacto con los servicios de soporte al cliente para obtener más información.
Error 8632:
Error interno: se ha alcanzado el límite de servicios de una expresión. Busque posibles expresiones complejas en la consulta e intente simplificarlas.
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.
USE AdventureWorks;
GO
SELECT FirstName, LastName, e.Title
FROM HumanResources.Employee AS e
JOIN Person.Contact AS c
ON e.ContactID = c.ContactID
WHERE e.Title = 'Design Engineer'
OR e.Title = 'Tool Designer'
OR e.Title = 'Marketing Assistant';
GO
No obstante, con IN se recuperan los mismos resultados.
USE AdventureWorks;
GO
SELECT FirstName, LastName, e.Title
FROM HumanResources.Employee AS e
JOIN Person.Contact AS c
ON e.ContactID = c.ContactID
WHERE e.Title 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.
USE AdventureWorks;
GO
SELECT FirstName, LastName
FROM Person.Contact AS c
JOIN HumanResources.Employee AS e
ON e.ContactID = c.ContactID
WHERE EmployeeID IN
(SELECT SalesPersonID
FROM Sales.SalesPerson
WHERE SalesQuota > 250000);
GO
Éste es el conjunto de resultados.
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 encuentra los vendedores que no coinciden con los elementos de la lista de valores.
USE AdventureWorks
GO
SELECT FirstName, LastName
FROM Person.Contact AS c
JOIN HumanResources.Employee AS e
ON e.ContactID = c.ContactID
WHERE EmployeeID NOT IN
(SELECT SalesPersonID
FROM Sales.SalesPerson
WHERE SalesQuota > 250000)
GO
Vea también