Поделиться через


IN (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW) в Microsoft Fabric Хранилище в базе данных Microsoft Fabric SQL в Microsoft Fabric

Определяет, совпадает ли указанное значение с одним из значений, содержащихся во вложенном запросе или списке.

Соглашения о синтаксисе Transact-SQL

Синтаксис

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

Аргументы

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

subquery
Вложенный запрос, содержащий результирующий набор, состоящий из одного столбца. Этот столбец должен иметь тот же тип данных, что и аргумент test_expression.

expression[ ,... n ]
Список выражений для поиска совпадения. Все выражения должны иметь тот же тип, что и аргумент test_expression.

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

Boolean

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

Если значение аргумента test_expression равно одному из значений, возвращенных вложенным запросом subquery или одному из значений, содержащихся в списке expression (где значения разделяются запятыми), результирующее значение равно TRUE. В противном случае оно равно FALSE.

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

Внимание

Для любых значений NULL, возвращаемых в subquery или expression, которые сравниваются со значением test_expression с помощью предложения IN или NOT IN, возвращается результат UNKNOWN. Использование значений NULL с предложениями IN или NOT IN может привести к непредвиденным результатам.

Замечания

Явное включение очень большого количества значений (много тысяч значений, разделенных запятыми) в круглые скобки в предложение IN может привести к интенсивному расходованию ресурсов и возврату ошибки 8623 или 8632. Чтобы избежать этой проблемы, храните элементы списка IN в таблице и используйте вложенный запрос SELECT в предложении IN.

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

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

Примеры

А. Сравнение OR и 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 = 'Design Engineer'   
   OR e.JobTitle = 'Tool Designer'   
   OR e.JobTitle = 'Marketing Assistant';  
GO  

Этот же результат можно получить при помощи оператора 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  

Ниже представлен результирующий набор, возвращаемый каждым из запросов.

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 с вложенным запросом

В следующем примере осуществляется поиск идентификаторов менеджеров по продажам в таблице SalesPerson, имеющих объем продаж более 250 000 долларов в год, а затем выборка из таблицы Employee имен и фамилий всех сотрудников, идентификаторы EmployeeID которых совпадают с результатами вложенного запроса 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  

Вот результирующий набор.

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

В. Применение NOT IN с вложенным запросом

В следующем примере производится поиск торговцев, квота которых не выше 250 000 долларов США. С помощью NOT IN можно найти торговцев, которые не соответствуют списку значений.

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

Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)

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

В следующем примере показан поиск всех записей в таблице FactInternetSales, которые соответствуют значениям SalesReasonKey в таблице DimSalesReason.

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

В следующем примере показан поиск всех записей в таблице FactInternetSalesReason, которые не соответствуют значениям SalesReasonKey в таблице DimSalesReason.

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

Е. Использование IN в списке выражений

В следующем примере осуществляется поиск всех идентификаторов продавцов в таблице DimEmployee сотрудников с именами Mike или Michael.

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

См. также

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