IN (Transact-SQL)IN (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ:даSQL Server (начиная с 2008)даБаза данных SQL AzureдаХранилище данных SQL AzureдаParallel Data WarehouseAPPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Определяет, совпадает ли указанное значение с одним из значений, содержащихся во вложенном запросе или списке.Determines whether a specified value matches any value in a subquery or a list.

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

СинтаксисSyntax

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

АргументыArguments

test_expressiontest_expression
Любое допустимое выражение expression.Is any valid expression.

subquerysubquery
Вложенный запрос, содержащий результирующий набор, состоящий из одного столбца.Is a subquery that has a result set of one column. Этот столбец должен иметь тот же тип данных, что и аргумент test_expression.This column must have the same data type as test_expression.

expression[ , ... n ]expression[ ,... n ]
Список выражений для поиска совпадения.Is a list of expressions to test for a match. Все выражения должны иметь тот же тип, что и аргумент test_expression.All expressions must be of the same type as test_expression.

Типы результатаResult Types

BooleanBoolean

Значение результатаResult Value

Если значение аргумента test_expression равно одному из значений, возвращенных вложенным запросом subquery или одному из значений, содержащихся в списке expression (где значения разделяются запятыми), результирующее значение равно TRUE. В противном случае оно равно FALSE.If the value of test_expression is equal to any value returned by subquery or is equal to any expression from the comma-separated list, the result value is TRUE; otherwise, the result value is FALSE.

Предложение NOT IN инвертирует значение subquery или expression.Using NOT IN negates the subquery value or expression.

Внимание!

Для любых значений NULL, возвращаемых в subquery или expression, которые сравниваются со значением test_expression с помощью предложения IN или NOT IN, возвращается результат UNKNOWN.Any null values returned by subquery or expression that are compared to test_expression using IN or NOT IN return UNKNOWN. Использование значений NULL с предложениями IN или NOT IN может привести к непредвиденным результатам.Using null values in together with IN or NOT IN can produce unexpected results.

RemarksRemarks

Явное включение очень большого количества значений (много тысяч значений, разделенных запятыми) в круглые скобки в предложение IN может привести к интенсивному расходованию ресурсов и возврату ошибки 8623 или 8632.Explicitly including an extremely large number of values (many thousands of values separated by commas) within the parentheses, in an IN clause can consume resources and return errors 8623 or 8632. Чтобы избежать этой проблемы, храните элементы списка IN в таблице и используйте вложенный запрос SELECT в предложении IN.To work around this problem, store the items in the IN list in a table, and use a SELECT subquery within an IN clause.

Ошибка 8623.Error 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.

Ошибка 8632.Error 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.A. Сравнение OR и INComparing OR and IN

В следующем примере осуществляется выборка списка имен сотрудников на должностях инженеров-разработчиков, разработчиков средств и сотрудников отдела сбыта.The following example selects a list of the names of employees who are design engineers, tool designers, or marketing assistants.

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

Этот же результат можно получить при помощи оператора IN.However, you retrieve the same results by using 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  

Ниже представлен результирующий набор, возвращаемый каждым из запросов.Here is the result set from either 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. Применение IN с вложенным запросомUsing IN with a subquery

В следующем примере осуществляется поиск идентификаторов менеджеров по продажам в таблице SalesPerson, имеющих объем продаж более 250 000 долларов в год, а затем выборка из таблицы Employee имен и фамилий всех сотрудников, идентификаторы EmployeeID которых совпадают с результатами вложенного запроса SELECT.The following example finds all IDs for the salespeople in the SalesPerson table for employees who have a sales quota greater than $250,000 for the year, and then selects from the Employee table the names of all employees where EmployeeID that match the results from the SELECT subquery.

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

Ниже приводится результирующий набор.Here is the result set.

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

В.C. Применение NOT IN с вложенным запросомUsing NOT IN with a subquery

В следующем примере производится поиск торговцев, квота которых не выше 250 000 долларов США.The following example finds the salespersons who do not have a quota greater than $250,000. С помощью NOT IN можно найти торговцев, которые не соответствуют списку значений.NOT IN finds the salespersons who do not match the items in the values list.

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

Примеры: Хранилище данных SQL AzureAzure SQL Data Warehouse и Параллельное хранилище данныхParallel Data WarehouseExamples: Хранилище данных SQL AzureAzure SQL Data Warehouse and Параллельное хранилище данныхParallel Data Warehouse

Г.D. Использование IN и NOT INUsing IN and NOT IN

В следующем примере показан поиск всех записей в таблице FactInternetSales, которые соответствуют значениям SalesReasonKey в таблице DimSalesReason.The following example finds all entries in the FactInternetSales table that match SalesReasonKey values in the DimSalesReason table.

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

В следующем примере показан поиск всех записей в таблице FactInternetSalesReason, которые не соответствуют значениям SalesReasonKey в таблице DimSalesReason.The following example finds all entries in the FactInternetSalesReason table that do not match SalesReasonKey values in the DimSalesReason table.

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

Д.E. Использование IN в списке выраженийUsing IN with an expression list

В следующем примере осуществляется поиск всех идентификаторов продавцов в таблице DimEmployee сотрудников с именами Mike или Michael.The following example finds all IDs for the salespeople in the DimEmployee table for employees who have a first name that is either Mike or Michael.

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

См. также:See Also

CASE (Transact-SQL) CASE (Transact-SQL)
Выражения (Transact-SQL) Expressions (Transact-SQL)
Встроенные функции (Transact-SQL) Built-in Functions (Transact-SQL)
Операторы (Transact-SQL) Operators (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
WHERE (Transact-SQL) WHERE (Transact-SQL)
ALL (Transact-SQL) ALL (Transact-SQL)
SOME | ANY (Transact-SQL)SOME | ANY (Transact-SQL)