IN (Transact-SQL)

Изменения: 5 декабря 2005 г.

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

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

Синтаксис

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

Аргументы

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

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

Boolean

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

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

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

ms177682.Caution(ru-ru,SQL.90).gifВнимание!
Для любых значений NULL, возвращаемых в полях subquery или expression, которые сравниваются со значением test_expression с помощью предложения IN или NOT IN, возвращается результат UNKNOWN. Использование значений NULL с предложениями IN или NOT IN может привести к непредвиденным результатам.

Примеры

А. Сравнение OR и IN

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

USE AdventureWorks;
GO
SELECT FirstName, LastName, e.Title
FROM HumanResources.Employee AS e
    JOIN Person.Contact AS c 
    ON e.ContactID = c.ContactID
WHERE e.Title = 'Design Engineer' 
   OR e.Title = 'Tool Designer' 
   OR e.Title = 'Marketing Assistant';
GO

Этот же результат можно получить при помощи оператора IN.

USE AdventureWorks;
GO
SELECT FirstName, LastName, e.Title
FROM HumanResources.Employee AS e
    JOIN Person.Contact AS c 
    ON e.ContactID = c.ContactID
WHERE e.Title 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 AdventureWorks;
GO
SELECT FirstName, LastName
FROM Person.Contact AS c
    JOIN HumanResources.Employee AS e
    ON e.ContactID = c.ContactID
WHERE EmployeeID IN
   (SELECT SalesPersonID
   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 AdventureWorks
GO
SELECT FirstName, LastName
FROM Person.Contact AS c
    JOIN HumanResources.Employee AS e
    ON e.ContactID = c.ContactID
WHERE EmployeeID NOT IN
   (SELECT SalesPersonID
   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)

Другие ресурсы

Основы вложенных запросов
Подзапросы с ключевым словом IN
Операторы сравнения с модификаторами ANY, SOME или ALL

Справка и поддержка

Получение помощи по SQL Server 2005

Журнал изменений

Версия Журнал

5 декабря 2005 г.

Новое содержимое
  • Добавлено предупреждение об использовании предложений IN и NOT IN со значениями NULL.