IN (Transact-SQL)
Détermine si une valeur donnée correspond à la valeur d'une liste ou d'une sous-requête.
Conventions de la syntaxe Transact-SQL
Syntaxe
test_expression [ NOT ] IN
( subquery | expression [ ,...n ]
)
Arguments
test_expression
Toute expression valide.subquery
Sous-requête avec un jeu de résultats d'une colonne. Cette colonne doit avoir le même type de données que test_expression.expression[ ,... n ]
Liste d'expressions utilisée pour vérifier une correspondance. Toutes les expressions doivent avoir le même type de données que test_expression.
Types de résultats
Boolean
Valeur des résultats
Si la valeur de test_expression est égale à une valeur retournée par subquery ou à l'un des arguments expression de la liste séparée par des virgules, le résultat est TRUE. Dans le cas contraire, ce résultat est FALSE.
L'utilisation de NOT IN retourne la valeur inverse de subquery ou expression.
Attention |
---|
Toute valeur NULL retournée par subquery ou expression qui est comparée à test_expression en utilisant IN ou NOT IN retourne UNKNOWN. L'utilisation de valeurs Null avec IN ou NOT IN peut produire des résultats inattendus. |
Notes
L'inclusion d'un nombre très élevé de valeurs (plusieurs milliers) dans une clause IN peut utiliser des ressources et retourner des erreurs 8623 ou 8632. Pour contourner ce problème, stockez les éléments dans la liste IN dans une table.
Erreur 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.
Erreur 8632 :
Internal error: An expression services limit has been reached. Please look for potentially complex expressions in your query, and try to simplify them.
Exemples
A.Comparaison des opérateurs OR et IN
L'exemple suivant sélectionne une liste des noms d'employés qui sont ingénieurs concepteurs, concepteurs d'outils ou assistants 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
Vous obtenez toutefois les mêmes résultats en utilisant IN.
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
Voici le jeu de résultats obtenu pour l'une ou l'autre des requêtes.
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.Utilisation de l'opérateur IN avec une sous-requête
L'exemple suivant recherche tous les ID des vendeurs dans la table SalesPerson pour les employés dont le quota de ventes annuel est supérieur à 250 000 $. Il sélectionne ensuite, dans la table Employee, les noms de tous les employés dont EmployeeID correspond aux résultats issus de la sous-requête 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
Voici l'ensemble des résultats.
FirstName LastName
--------- --------
Tsvi Reiter
Michael Blythe
Tete Mensa-Annan
(3 row(s) affected)
C.Utilisation de l'opérateur NOT IN avec une sous-requête
L'exemple suivant recherche les vendeurs qui n'ont pas de quota supérieur à 250 000 $. NOT IN identifie les vendeurs qui ne correspondent pas aux éléments de la liste de valeurs.
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