Compartir a través de


IN (Transact-SQL)

Determina si un valor especificado coincide con algún valor de una subconsulta o una lista.

Icono de vínculo a temas Convenciones de sintaxis de Transact-SQL

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.

Nota de advertenciaAdvertencia

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.

Comentarios

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:

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.

USE AdventureWorks2012;
GO
SELECT p.FirstName, p.LastName, e.JobTitle
FROM Person.Person 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.

USE AdventureWorks2012;
GO
SELECT p.FirstName, p.LastName, e.JobTitle
FROM Person.Person 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 Id. 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 AdventureWorks2012;
GO
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.

USE AdventureWorks2012;
GO
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

Vea también

Referencia

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)