Sdílet prostřednictvím


IN (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Určuje, zda zadaná hodnota odpovídá libovolné hodnotě v poddotazu nebo seznamu.

Transact-SQL konvence syntaxe

Syntax

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

Arguments

test_expression
Je libovolný platný výraz.

subquery
Je poddotaz, který má sadu výsledků jednoho sloupce. Tento sloupec musí mít stejný datový typ jako test_expression.

výraz[ ,... n ]
Je seznam výrazů k otestování shody. Všechny výrazy musí být stejného typu jako test_expression.

Typy výsledků

Boolean

Hodnota výsledku

Pokud je hodnota test_expression rovna jakékoli hodnotě vrácené poddotazem nebo je rovna libovolnému výrazu ze seznamu odděleného čárkami, výsledná hodnota je PRAVDA; jinak je výsledná hodnota NEPRAVDA.

Funkce NOT IN neguje hodnotu nebo výrazpoddotaz.

Caution

Všechny hodnoty null vrácené poddotazem nebo výrazem , které se porovnávají s test_expression pomocí funkce IN nebo NOT IN return UNKNOWN. Použití hodnot null společně s hodnotou IN nebo NOT IN může vést k neočekávaným výsledkům.

Remarks

Explicitní zahrnutí extrémně velkého počtu hodnot (mnoho tisíc hodnot oddělených čárkami) v závorkách může v klauzuli IN využívat prostředky a vracet chyby 8623 nebo 8632. Chcete-li tento problém vyřešit, uložte položky v seznamu IN v tabulce a použijte poddotaz SELECT v klauzuli IN.

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

Chyba 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. Porovnání OR a IN

Následující příklad vybere seznam zaměstnanců, kteří jsou návrháři návrhu, návrháři nástrojů nebo marketingoví asistenti.

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

Pomocí funkce IN však načtete stejné výsledky.

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

Tady je sada výsledků z libovolného dotazu.

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. Použití in s poddotazem

Následující příklad najde všechna ID prodejců v SalesPerson tabulce pro zaměstnance, kteří mají kvótu prodeje větší než 250 000 USD za rok, a pak vybere z Employee tabulky jména všech zaměstnanců, kteří EmployeeID odpovídají výsledkům poddotazů 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  

Tady je soubor výsledků.

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

C. Použití funkce NOT IN s poddotazem

Následující příklad najde prodejce, kteří nemají kvótu větší než 250 000 USD. NOT IN najde prodejce, kteří neodpovídají položkám v seznamu hodnot.

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

Příklady: Azure Synapse Analytics a Analytický platformový systém (PDW)

D. Použití IN a NOT IN

Následující příklad najde všechny položky v FactInternetSales tabulce, které odpovídají SalesReasonKey hodnotám DimSalesReason v tabulce.

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

Následující příklad najde všechny položky v FactInternetSalesReason tabulce, které neodpovídají SalesReasonKey hodnotám DimSalesReason v tabulce.

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

E. Použití funkce IN se seznamem výrazů

Následující příklad najde všechna ID prodejců v DimEmployee tabulce pro zaměstnance, kteří mají křestní jméno, které je buď Mike nebo Michael.

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

Viz také

PŘÍPAD (Transact-SQL)
Výrazy (Transact-SQL)
Předdefinované funkce (Transact-SQL)
Operátory (Transact-SQL)
SELECT (Transact-SQL)
KDE (Transact-SQL)
VŠICHNI (Transact-SQL)
NĚKTERÉ | ANY (Transact-SQL)