- 29/08/2016
- 4 minutes de lecture
-
- c
- j
- r
- M
- i
-
+5
S’applique à : SQL Server (toutes versions prises en charge) Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Parallel Data Warehouse
Détermine si une valeur spécifiée correspond à toute valeur dans une sous-requête ou une liste.
Conventions syntaxiques Transact-SQL
Syntaxe
test_expression IN ( subquery | expression )
Note
Pour consulter la syntaxe Transact-SQL de SQL Server 2014 et des versions antérieures, consultez la documentation des versions antérieures.
Arguments
Test_expression
Il s’agit de toute expression valide.
Sous-requête
Il s’agit d’une sous-requête dont le jeu de résultats est constitué d’une seule colonne. Cette colonne doit avoir le même type de données que test_expression.
expression
Est une liste d’expressions à tester pour une correspondance. Toutes les expressions doivent être du même type que test_expression.
Types de résultat
Booléen
Valeur du résultat
Si la valeur de test_expression est égale à toute valeur renvoyée par subquery ou est égale à toute expression de la liste séparée par des virgules, la valeur du résultat est VRAIE ; sinon, la valeur du résultat est FAUX.
L’utilisation de NOT IN annule la valeur de la sous-requête ou l’expression.
Attention
Toutes les valeurs nulles renvoyées par la sous-requête ou l’expression qui sont comparées à test_expression en utilisant IN ou NOT IN renvoient UNKNOWN. L’utilisation de valeurs nulles en même temps que IN ou NOT IN peut produire des résultats inattendus.
Remarques
Inclure explicitement un nombre extrêmement important de valeurs (plusieurs milliers de valeurs séparées par des virgules) entre les parenthèses, dans une clause IN peut consommer des ressources et renvoyer des erreurs 8623 ou 8632. Pour contourner ce problème, stockez les éléments de la liste IN dans une table, et utilisez une sous-requête SELECT dans une clause IN.
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 de OR et IN
L’exemple suivant sélectionne une liste des noms des employés qui sont ingénieurs d’études, concepteurs d’outils ou assistants 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
Cependant, vous récupérez les mêmes résultats en utilisant 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
Voici le jeu de résultats de l’une ou l’autre requête.
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 IN avec une sous-requête
L’exemple suivant trouve tous les ID des vendeurs dans la table SalesPerson
pour les employés qui ont un quota de vente supérieur à 250 000 $ pour l’année, puis sélectionne dans le tableau Employee
les noms de tous les employés où EmployeeID
qui correspondent aux résultats de la sous-requête 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
Voici le jeu de résultats.
FirstName LastName --------- -------- Tsvi Reiter Michael Blythe Tete Mensa-Annan (3 row(s) affected)
C. Utilisation de NOT IN avec une sous-requête
L’exemple suivant trouve les vendeurs qui n’ont pas un quota supérieur à 250 000 $. NOT IN
trouve les vendeurs qui ne correspondent pas aux éléments de la liste de valeurs.
-- 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
Exemples : Azure Synapse Analytics et Parallel Data Warehouse
D. Utilisation de IN et NOT IN
L’exemple suivant trouve toutes les entrées de la table FactInternetSales
qui correspondent aux valeurs SalesReasonKey
de la table DimSalesReason
.
-- Uses AdventureWorks SELECT * FROM FactInternetSalesReason WHERE SalesReasonKey IN (SELECT SalesReasonKey FROM DimSalesReason);
L’exemple suivant trouve toutes les entrées du tableau FactInternetSalesReason
qui ne correspondent pas aux valeurs SalesReasonKey
du tableau DimSalesReason
.
-- Uses AdventureWorks SELECT * FROM FactInternetSalesReason WHERE SalesReasonKey NOT IN (SELECT SalesReasonKey FROM DimSalesReason);
F. Utilisation de IN avec une liste d’expressions
L’exemple suivant trouve tous les ID des vendeurs dans la table DimEmployee
pour les employés dont le prénom est soit Mike
soit Michael
.
-- Uses AdventureWorks SELECT FirstName, LastName FROM DimEmployee WHERE FirstName IN ('Mike', 'Michael');
Voir aussi
CASE (Transact-SQL)
Expressions (Transact-SQL)
Fonctions intégrées (Transact-.SQL)
Opérateurs (Transact-SQL)
SÉLECTION (Transact-SQL)
WHERE (Transact-SQL)
ALL (Transact-SQL)
SOME | ANY (Transact-SQL)