IN (Transact-SQL)

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

Применимо для следующих объектов: SQL Server (SQL Server 2008 по текущую версию), База данных SQL Windows Azure (С первоначального выпуска по текущий выпуск).

Значок ссылки на раздел Cинтаксические обозначения в Transact-SQL

Синтаксис

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

Аргументы

  • test_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 в таблице.

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

В следующем примере осуществляется выборка списка имен сотрудников на должностях инженеров-разработчиков, разработчиков средств и сотрудников отдела сбыта.

USE AdventureWorks2012;
GO
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.

USE AdventureWorks2012;
GO
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)

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

В следующем примере осуществляется поиск идентификаторов менеджеров по продажам в таблице SalesPerson, имеющих объем продаж более 250 000 долларов в год, а затем выборка из таблицы Employee имен и фамилий всех сотрудников, идентификаторы EmployeeID которых совпадают с результатами вложенного запроса SELECT.

USE AdventureWorks2012;
GO
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 можно найти торговцев, которые не соответствуют списку значений.

USE AdventureWorks2012;
GO
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

См. также

Справочник

Выражение CASE (Transact-SQL)

Выражения (Transact-SQL)

Встроенные функции (Transact-SQL)

Операторы (Transact-SQL)

SELECT (Transact-SQL)

Предложение WHERE (Transact-SQL)

ALL (Transact-SQL)

SOME | ANY (Transact-SQL)