IN (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.
Обработчик запросов исчерпал внутренние ресурсы и поэтому не предоставил план запроса. Это редкое событие, которое может происходить только при очень сложных запросах или запросах, которые обращаются к очень большому числу таблиц или секций. Упростите запрос. Если предполагается, что это сообщение получено по ошибке, свяжитесь со службой поддержки пользователей для получения дополнительных сведений.
Ошибка 8632.
Внутренняя ошибка: был достигнут предел служб выражений. Проверьте потенциально сложные выражения в запросе и постарайтесь их упростить.
Примеры
А. Сравнение OR и IN
В следующем примере осуществляется выборка списка имен сотрудников на должностях инженеров-разработчиков, разработчиков средств и сотрудников отдела сбыта.
USE AdventureWorks2008R2;
GO
SELECT p.FirstName, p.LastName, e.JobTitle
FROM Person.Person 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 AdventureWorks2008R2;
GO
SELECT p.FirstName, p.LastName, e.JobTitle
FROM Person.Person 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 тыс. долларов в год, а затем выборка их фамилий из таблицы Employee по соответствию значения столбца EmployeeID результату, возвращенному вложенным запросом SELECT.
USE AdventureWorks2008R2;
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 тыс. долларов. NOT IN производит поиск менеджеров по продажам, для которых нет соответствующих элементов в списке значений.
USE AdventureWorks2008R2
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
См. также