IN 연산자

IN 연산자 (IN Operator)

IN 연산자는 왼쪽 표현식이 오른쪽의 컬렉션(collection) 안에 포함되어 있는지 확인하는 연산자예요. 오른쪽에 올 수 있는 컬렉션은 튜플(tuple), 리스트(list), 맵(map), 그리고 단일 컬럼을 반환하는 서브쿼리(subquery)가 있어요. 단일 컬럼 제한은 서브쿼리에만 적용된다는 점을 기억하세요. 튜플, 리스트, 맵은 그 자체로 복합 값을 가질 수 있어요.

출처: 문서

본문

IN (val1, val2, ...) (튜플)

튜플 (val1, val2, ...)에 대한 IN 연산자는 표현식이 오른쪽(RHS)에 있으면 true를, 오른쪽에 없고 RHS에 NULL 값이 없으면 false를 반환해요. 오른쪽에 없고 RHS에 NULL 값이 있으면 NULL을 반환해요.

SELECT 'Math' IN ('CS', 'Math');
true
SELECT 'English' IN ('CS', 'Math');
false
SELECT 'Math' IN ('CS', 'Math', NULL);
true
SELECT 'English' IN ('CS', 'Math', NULL);
NULL

IN [val1, val2, ...] (리스트)

IN 연산자는 Python에서 사용하는 의미론(semantics)에 따라 리스트에서 동작해요. 튜플 IN 연산자와 달리, 오른쪽에 NULL 값이 있어도 결과에 차이가 생기지 않아요.

SELECT 'Math' IN ['CS', 'Math', NULL];
true
SELECT 'English' IN ['CS', 'Math', NULL];
false

IN 맵 (Map)

IN 연산자는 에서 Python의 의미론을 따라 동작해요. 즉, 값이 아니라 키(key)의 존재 여부를 확인해요.

SELECT 'key1' IN MAP {'key1': 50, 'key2': 75};
true
SELECT 'key3' IN MAP {'key1': 50, 'key2': 75};
false

IN 서브쿼리 (Subquery)

IN 연산자는 단일 컬럼을 반환하는 서브쿼리와 함께 동작해요.

예를 들어:

SELECT 42 IN (SELECT unnest([32, 42, 52]) AS x);
true

서브쿼리가 두 개 이상의 컬럼을 반환하면 Binder 오류가 발생해요:

SELECT 42 IN (SELECT unnest([32, 42, 52]) AS x, 'a' AS y);
Binder Error:
Subquery returns 2 columns - expected 1

IN 문자열 (String)

IN 연산자는 contains 문자열 함수의 줄임 표현으로 사용할 수 있어요.

예를 들어:

SELECT 'Hello' IN 'Hello World';
true

NOT IN

NOT IN은 요소가 집합에 없음을 확인할 때 사용해요. x NOT IN yNOT (x IN y)와 동일해요.

더 알아보기 (Learn more)