Condividi tramite


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)