Condividi tramite


IN (Transact-SQL)

Determina se il valore specificato corrisponde a un valore in una sottoquery o in un elenco.

Icona di collegamento a un argomento Convenzioni della 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 tale colonna deve corrispondere a quello di test_expression.

  • expression[ ,... n ]
    Elenco di espressioni in cui individuare una corrispondenza. Il tipo di dati di tutte le espressioni deve corrispondere al tipo di dati di test_expression.

Tipi restituiti

Boolean

Valore restituito

Se il valore di test_expression corrisponde a uno dei valori restituiti da subquery o a una delle espressioni dell'elenco expression delimitato da virgole, il valore restituito è TRUE. In caso contrario, il valore restituito è FALSE.

Utilizzando NOT IN, il valore subquery o expression viene negato.

Nota di attenzioneAttenzione

Qualsiasi valore Null restituito da subquery o expression e confrontato con test_expression utilizzando IN o NOT IN restituisce UNKNOWN. L'utilizzo di valori Null insieme a IN o NOT IN può generare risultati imprevisti.

Osservazioni

Se in una clausola IN viene incluso un numero estremamente grande (molte migliaia) di valori, è possibile che venga richiesta una quantità significativa di risorse e che vengano restituiti errori 8623 o 8632. Per risolvere questo problema, archiviare gli elementi dell'elenco IN in una tabella.

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 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.

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

Gli stessi risultati vengono tuttavia recuperati tramite 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

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 i €250.000 e vengono quindi selezionati dalla tabella Employee i nomi di tutti i dipendenti il cui EmployeeID corrisponde ai risultati della sottoquery 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

Set di risultati:

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.

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

Vedere anche

Riferimento

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)