Udostępnij za pomocą


IN (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punkt końcowy analizy SQL w usłudze Microsoft FabricHurtownia danych w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric

Określa, czy określona wartość jest zgodna z dowolną wartością w podzapytaniu, czy na liście.

Transact-SQL konwencje składni

Syntax

test_expression [ NOT ] IN   
    ( subquery | expression [ ,...n ]  
    )   

Arguments

test_expression
Jest dowolnym prawidłowym wyrażeniem.

subquery
Jest podzapytaniem zawierającym zestaw wyników jednej kolumny. Ta kolumna musi mieć ten sam typ danych co test_expression.

wyrazu twarzy[ ,... n ]
To lista wyrażeń do przetestowania pod kątem dopasowania. Wszystkie wyrażenia muszą być tego samego typu co test_expression.

Typy wyników

Boolean

Wartość wyniku

Jeśli wartość test_expression jest równa dowolnej wartości zwracanej przez podzapytanie lub jest równa dowolnemu wyrażeniu z listy rozdzielanej przecinkami, wartość wyniku ma wartość TRUE; w przeciwnym razie wartość wyniku to FALSE.

Użycie funkcji NOT IN neguje wartość lub wyrażeniepodzapytania.

Caution

Wszystkie wartości null zwracane przez podzapytania lub wyrażenie , które są porównywane z test_expression przy użyciu funkcji IN lub NOT IN zwracane nieznane. Użycie wartości null w połączeniu z in lub NOT IN może spowodować nieoczekiwane wyniki.

Remarks

Jawne uwzględnienie bardzo dużej liczby wartości (wiele tysięcy wartości rozdzielonych przecinkami) w nawiasach w klauzuli IN może zużywać zasoby i zwracać błędy 8623 lub 8632. Aby obejść ten problem, zapisz elementy na liście IN w tabeli i użyj podzapytania SELECT w klauzuli IN.

Błąd 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.

Błąd 8632:

Internal error: An expression services limit has been reached. Please look for potentially complex expressions in your query, and try to simplify them.

Examples

A. Porównywanie or i IN

Poniższy przykład wybiera listę nazwisk pracowników, którzy są inżynierami projektowymi, projektantami narzędzi lub asystentami marketingu.

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

Jednak te same wyniki są pobierane przy użyciu metody 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  

Oto zestaw wyników z dowolnego zapytania.

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. Używanie metody IN z podzapytaniem

W poniższym przykładzie znaleziono wszystkie identyfikatory dla sprzedawców w SalesPerson tabeli dla pracowników, którzy mają limit przydziału sprzedaży większy niż 250 000 USD za rok, a następnie wybiera z Employee tabeli nazwy wszystkich pracowników, gdzie EmployeeID pasują do wyników z SELECT podzapytania.

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

Oto zestaw wyników.

FirstName   LastName                                             
---------   --------   
Tsvi         Reiter                                              
Michael      Blythe                                              
Tete         Mensa-Annan                                         
  
(3 row(s) affected)  

C. Używanie funkcji NOT IN z podzapytaniem

W poniższym przykładzie znajdują się sprzedawcy, którzy nie mają limitu przydziału większego niż 250 000 USD. NOT IN znajduje sprzedawców, którzy nie są zgodni z elementami na liście wartości.

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

Przykłady: Azure Synapse Analytics and Analytics Platform System (PDW)

D. Używanie funkcji IN i NOT IN

Poniższy przykład znajduje wszystkie wpisy w FactInternetSales tabeli, które pasują do SalesReasonKey wartości w DimSalesReason tabeli.

-- Uses AdventureWorks  
  
SELECT * FROM FactInternetSalesReason   
WHERE SalesReasonKey   
IN (SELECT SalesReasonKey FROM DimSalesReason);   

Poniższy przykład znajduje wszystkie wpisy w FactInternetSalesReason tabeli, które nie pasują do SalesReasonKey wartości w DimSalesReason tabeli.

-- Uses AdventureWorks  
  
SELECT * FROM FactInternetSalesReason   
WHERE SalesReasonKey   
NOT IN (SELECT SalesReasonKey FROM DimSalesReason);  

E. Używanie funkcji IN z listą wyrażeń

W poniższym przykładzie znaleziono wszystkie identyfikatory sprzedawców w DimEmployee tabeli dla pracowników, którzy mają imię lub MikeMichael.

-- Uses AdventureWorks  
  
SELECT FirstName, LastName  
FROM DimEmployee  
WHERE FirstName IN ('Mike', 'Michael');  

Zobacz też

SPRAWA (Transact-SQL)
Wyrażenia (Transact-SQL)
Wbudowane funkcje (Transact-SQL)
Operatory (Transact-SQL)
WYBIERZ (Transact-SQL)
GDZIE (Transact-SQL)
WSZYSCY (Transact-SQL)
NIEKTÓRE | ANY (Transact-SQL)