IN (Transact-SQL)
Determina se il valore specificato corrisponde a un valore in una sottoquery o in un elenco.
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.
Attenzione |
---|
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:
Query Processor non è in grado di generare un piano di query perché ha esaurito le risorse interne. Si tratta di un evento raro previsto solo in caso di query estremamente complesse o che fanno riferimento a un numero di tabelle o partizioni molto elevato. Semplificare la query. Se si ritiene che questo messaggio sia stato visualizzato per errore, contattare il Servizio Supporto Tecnico Clienti Microsoft per ottenere ulteriori informazioni.
Errore 8632:
Errore interno: è stato raggiunto un limite per i servizi di gestione delle espressioni. Provare a semplificare la query rimuovendo le espressioni particolarmente complesse.
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 AdventureWorks;
GO
SELECT FirstName, LastName, e.Title
FROM HumanResources.Employee AS e
JOIN Person.Contact AS c
ON e.ContactID = c.ContactID
WHERE e.Title = 'Design Engineer'
OR e.Title = 'Tool Designer'
OR e.Title = 'Marketing Assistant';
GO
Gli stessi risultati vengono tuttavia recuperati tramite IN.
USE AdventureWorks;
GO
SELECT FirstName, LastName, e.Title
FROM HumanResources.Employee AS e
JOIN Person.Contact AS c
ON e.ContactID = c.ContactID
WHERE e.Title 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 AdventureWorks;
GO
SELECT FirstName, LastName
FROM Person.Contact AS c
JOIN HumanResources.Employee AS e
ON e.ContactID = c.ContactID
WHERE EmployeeID IN
(SELECT SalesPersonID
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 della parola chiave 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 AdventureWorks
GO
SELECT FirstName, LastName
FROM Person.Contact AS c
JOIN HumanResources.Employee AS e
ON e.ContactID = c.ContactID
WHERE EmployeeID NOT IN
(SELECT SalesPersonID
FROM Sales.SalesPerson
WHERE SalesQuota > 250000)
GO
Vedere anche