- 08/29/2016
- 4 minuti per leggere
-
- c
- j
- r
- M
- i
-
+5
Si applica a: QL Server (tutte le versioni supportate) Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Parallel Data Warehouse
Determina se un valore specificato corrisponde a qualsiasi valore in una subquery o un elenco.
Convenzioni sintassi Transact-SQL
Sintassi
test_expression IN ( subquery | expression )
Nota
Per vedere la sintassi Transact-SQL per SQL Server 2014 e precedenti, vedere la documentazione delle versioni precedenti.
Argomenti
test_expression
È qualsiasi espressione valida.
subquery
È una subquery che ha un set di risultati di una colonna. Questa colonna deve avere lo stesso tipo di dati di test_expression.
expression
È una lista di espressioni da testare per una corrispondenza. Tutte le espressioni devono essere dello stesso tipo di test_expression.
Tipi di risultato
Booleano
Valore del risultato
Se il valore di test_expression è uguale a qualsiasi valore restituito dalla subquery o è uguale a qualsiasi espressione della lista separata da virgole, il valore del risultato è TRUE; altrimenti, il valore del risultato è FALSE.
Utilizzando NOT IN si nega il valore della subquery o dell’espressione.
Attenzione
Qualsiasi valore nullo restituito dalla subquery o dall’espressione che viene confrontato con test_expression utilizzando IN o NOT IN restituisce UNKNOWN. L’utilizzo di valori nulli insieme a IN o NOT IN può produrre risultati inaspettati.
Remarks
Includere esplicitamente un numero estremamente grande di valori (molte migliaia di valori separati da virgole) tra le parentesi, in una clausola IN può consumare risorse e restituire errori 8623 o 8632. Per aggirare questo problema, memorizzate gli elementi della lista IN in una tabella e usate una sottoquery SELECT all’interno di una clausola IN.
Errore 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.
Errore 8632:
Internal error: An expression services limit has been reached. Please look for potentially complex expressions in your query, and try to simplify them.
Esempi
A. Confronto tra OR e IN
L’esempio seguente seleziona una lista di nomi di dipendenti che sono ingegneri di progettazione, progettisti di utensili o assistenti di 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
Tuttavia, si ottengono gli stessi risultati usando 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
Ecco il risultato di entrambe le query.
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 subquery
L’esempio seguente trova tutti gli ID per i venditori nella tabella SalesPerson
per i dipendenti che hanno una quota di vendite maggiore di $250.000 per l’anno, e poi seleziona dalla tabella Employee
i nomi di tutti i dipendenti dove EmployeeID
che corrispondono ai risultati della SELECT
subquery.
-- 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
Ecco il set di risultati.
FirstName LastName --------- -------- Tsvi Reiter Michael Blythe Tete Mensa-Annan (3 row(s) affected)
C. Usare NOT IN con una sottoquery
L’esempio seguente trova i venditori che non hanno una quota maggiore di $250.000. NOT IN
trova i venditori che non corrispondono alle voci della lista dei valori.
-- 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
Esempi: Azure Synapse Analytics e Parallel Data Warehouse
D. Utilizzo di IN e NOT IN
L’esempio seguente trova tutte le voci nella tabella FactInternetSales
che corrispondono a SalesReasonKey
valori nella tabella DimSalesReason
.
-- Uses AdventureWorks SELECT * FROM FactInternetSalesReason WHERE SalesReasonKey IN (SELECT SalesReasonKey FROM DimSalesReason);
L’esempio seguente trova tutte le voci nella tabella FactInternetSalesReason
che non corrispondono ai valori SalesReasonKey
nella tabella DimSalesReason
.
-- Uses AdventureWorks SELECT * FROM FactInternetSalesReason WHERE SalesReasonKey NOT IN (SELECT SalesReasonKey FROM DimSalesReason);
E. Utilizzo di IN con una lista di espressioni
L’esempio seguente trova tutti gli ID per gli addetti alle vendite nella tabella DimEmployee
per gli impiegati che hanno un nome che è o Mike
o Michael
.
-- Uses AdventureWorks SELECT FirstName, LastName FROM DimEmployee WHERE FirstName IN ('Mike', 'Michael');
Vedi anche
CASE (Transact-SQL)
Espressioni (Transact-SQL)
Funzioni integrate (Transact-SQL)
Operatori (Transact-SQL)
SELECT (Transact-SQL)
WHERE (Transact-SQL)
ALL (Transact-SQL)
SOME | ANY (Transact-SQL)