IN (Transact-SQL)
Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure endpoint di analisi SQL di Azure Synapse Analytics Platform System (PDW) in Microsoft Fabric Warehouse nel database SQL di Microsoft Fabric in Microsoft Fabric
Determina se il valore specificato corrisponde a un valore in una sottoquery o in un elenco.
Convenzioni relative alla sintassi Transact-SQL
Sintassi
test_expression [ NOT ] IN
( subquery | expression [ ,...n ]
)
Argomenti
test_expression
Qualsiasi espressione valida.
subquery
Sottoquery che include un set di risultati di una colonna. Il tipo di dati di questa colonna deve corrispondere a quello di test_expression.
expression[ ,... n ]
Elenco di espressioni in cui individuare una corrispondenza. Tutte le espressioni devono essere dello stesso tipo di test_expression.
Tipi restituiti
Booleano
Valore restituito
Se il valore di test_expression è uguale a uno dei valori restituiti da subquery o a qualsiasi elemento expression dell'elenco delimitato da virgole, il valore restituito è TRUE. In caso contrario, il valore restituito è FALSE.
L'uso di NOT IN nega il valore di subquery o l'elemento expression.
Attenzione
Qualsiasi valore Null restituito da subquery o expression che viene confrontato con test_expression usando IN o NOT IN restituisce UNKNOWN. L'utilizzo di valori Null insieme a IN o NOT IN può generare risultati imprevisti.
Osservazioni:
L'inclusione esplicita di un numero estremamente elevato di valori (molte migliaia di valori delimitati da virgole) all'interno di parentesi, in una clausola IN può determinare un uso elevato delle risorse e restituire gli errori 8623 o 8632. Per risolvere questo problema, archiviare gli elementi dell'elenco IN in una tabella e usare una sottoquery SELECT all'interno della 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
R. Confronto di OR e IN
Nell'esempio seguente viene selezionato un elenco di nomi dei dipendenti con il titolo di Design Engineer, Tool Designer o Marketing Assistant.
-- 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
Gli stessi risultati vengono tuttavia recuperati tramite 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
Set di risultati per 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. Utilizzo di IN con una sottoquery
Nell'esempio seguente vengono recuperati tutti gli ID dei venditori nella tabella SalesPerson
per i dipendenti la cui quota di vendita per l'anno corrente supera € 250.000 e vengono quindi selezionati dalla tabella Employee
i nomi di tutti i dipendenti il cui EmployeeID
corrisponde ai risultati della sottoquery 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
Il set di risultati è il seguente.
FirstName LastName
--------- --------
Tsvi Reiter
Michael Blythe
Tete Mensa-Annan
(3 row(s) affected)
C. Utilizzo di NOT IN con una sottoquery
Nell'esempio seguente vengono recuperati tutti i venditori la cui quota di vendita è inferiore o uguale a €250.000. NOT IN
restituisce i venditori che non corrispondono agli elementi nell'elenco 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 Piattaforma di strumenti analitici (PDW)
D. Uso di IN e NOT IN
Nell'esempio seguente vengono recuperate tutte le voci nella tabella FactInternetSales
che corrispondono ai valori SalesReasonKey
nella tabella DimSalesReason
.
-- Uses AdventureWorks
SELECT * FROM FactInternetSalesReason
WHERE SalesReasonKey
IN (SELECT SalesReasonKey FROM DimSalesReason);
Nell'esempio seguente vengono recuperate 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. Uso di IN con un elenco di espressioni
Nell'esempio seguente vengono recuperati tutti gli ID dei venditori nella tabella DimEmployee
per i dipendenti di nome Mike
o Michael
.
-- Uses AdventureWorks
SELECT FirstName, LastName
FROM DimEmployee
WHERE FirstName IN ('Mike', 'Michael');
Vedi anche
CASE (Transact-SQL)
Espressioni (Transact-SQL)
Funzioni predefinite (Transact-SQL)
Operatori (Transact-SQL)
SELECT (Transact-SQL)
WHERE (Transact-SQL)
ALL (Transact-SQL)
SOME | ANY (Transact-SQL)