IN(Transact-SQL)

지정된 값과 일치하는 값이 하위 쿼리 또는 목록 내에 있는지 확인합니다.

항목 링크 아이콘Transact-SQL 구문 표기 규칙

구문

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

인수

  • test_expression
    유효한 입니다.

  • subquery
    하나의 열로 구성된 결과 집합을 갖는 하위 쿼리입니다. 이 열은 test_expression과 데이터 형식이 같아야 합니다.

  • expression[ ,... n ]
    일치 여부를 검사할 식의 목록입니다. 모든 식은 test_expression과 데이터 형식이 같아야 합니다.

결과 형식

Boolean

결과 값

subquery에서 반환된 값 또는 쉼표로 구분된 expression 목록에 test_expression과 일치하는 값이 있을 경우 결과 값은 TRUE입니다. 그렇지 않으면 결과 값은 FALSE입니다.

NOT IN을 사용하면 subquery 값이나 expression이 부정됩니다.

주의 사항주의

subquery 또는 expression에서 반환되는 Null 값은 IN 또는 NOT IN을 사용한 test_expression에서 UNKNOWN으로 반환됩니다. IN 또는 NOT IN과 함께 Null 값을 사용하면 예기치 않은 결과가 발생할 수 있습니다.

주의

IN 절에 너무 많은 값(수천 개)을 포함하면 리소스가 소비되고 오류 8623 또는 8632가 반환됩니다. 이 문제를 해결하려면 IN 목록의 항목을 테이블에 저장합니다.

오류 8623:

쿼리 프로세서에서 내부 리소스가 부족하므로 쿼리 계획을 생성할 수 없습니다. 이러한 이벤트는 너무 복잡한 쿼리나 너무 많은 테이블 또는 파티션을 참조하는 쿼리에서만 매우 드물게 발생합니다. 쿼리를 단순하게 만드십시오. 이 메시지가 오류로 인해 표시되었다고 판단되면 고객 지원 서비스에 자세한 내용을 문의하십시오.

오류 8632:

내부 오류: 식 서비스 제한에 도달했습니다. 쿼리에서 복잡한 식을 찾아서 단순하게 만드십시오.

1. 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)

2. 하위 쿼리와 함께 IN 사용

다음 예에서는 SalesPerson 테이블에서 연간 판매 할당량이 $250,000 이상인 모든 직원들의 ID를 찾은 다음 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)

3. 하위 쿼리와 함께 NOT IN 사용

다음 예에서는 할당량이 $250,000 이하인 영업 사원을 찾습니다. 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