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 y는 NOT (x IN y)와 동일해요.