IN (Transact-SQL)
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW) в Microsoft Fabric Хранилище в 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)
C. Применение 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)