카테고리:

조건식 함수

[ NOT ] IN

해당 인자가 명시적 목록의 멤버 또는 하위 쿼리의 결과 중 하나인지 여부를 테스트합니다.

참고

하위 쿼리 형식에서 IN은 = ANY 와 동일하고 NOT IN은 <> ALL 과 동일합니다.

검색 최적화 서비스를 사용하여 이 함수를 호출하는 쿼리의 성능을 향상할 수 있습니다. 자세한 내용은 검색 최적화 서비스 섹션을 참조하십시오.

구문

개별 값을 비교하려면:

<value> [ NOT ] IN ( <value_1> [ , <value_2> ...  ] )
Copy

행 생성자 (괄호로 묶인 값 목록)를 비교하려면:

( <value_A> [, <value_B> ... ] ) [ NOT ] IN (  ( <value_1> [ , <value_2> ... ] )  [ , ( <value_3> [ , <value_4> ... ] )  ...  ]  )
Copy

값을 하위 쿼리에서 반환된 값과 비교하려면:

<value> [ NOT ] IN ( <subquery> )
Copy

매개 변수

value

검색할 값입니다.

value_A, value_B

검색할 행 생성자의 요소입니다.

IN 의 오른쪽에 있는 각각의 값(예: (value3, value4))이 IN 의 왼쪽에 있는 값(예: (value_A, value_B))과 같은 수의 요소를 갖도록 합니다.

value_#

value 와 비교해야 하는 값입니다.

비교할 값이 행 생성자인 경우 각 value_# 는 행 생성자의 개별 요소입니다.

subquery

value 와 비교할 수 있는 값의 목록을 반환하는 하위 쿼리입니다.

사용법 노트

  • 대부분의 컨텍스트에서와 같이, NULL은 NULL과 같지 않습니다. value`가 NULL인 경우 목록 또는 하위 쿼리에 NULL이 포함되어 있는지 여부에 따라 함수의 반환 값은 NULL입니다. :ref:`label_in_list_null_examples 섹션을 참조하세요.

  • 구문적으로, IN 은 함수가 아닌 연산자로 처리됩니다. 이 예에서는 IN 을 연산자로 사용하는 것과 f() 를 함수로 호출하는 것의 차이점을 보여줍니다.

    SELECT
        f(a, b),
        x IN (y, z) ...
    
    Copy

    IN과 함께 함수 구문을 사용할 수 없습니다. 예를 들어, 앞의 예를 다음과 같이 다시 쓸 수 없습니다.

    SELECT
        f(a, b),
        IN(x, (y, z)) ...
    
    Copy
  • IN 은 하위 쿼리 연산자 로도 간주됩니다.

  • IN 을 사용하는 쿼리에서 배열 을 스프레드 연산자(**)를 사용하여 개별 값의 목록으로 확장할 수 있습니다. 자세한 정보와 예제는 확장 연산자 섹션을 참조하십시오.

데이터 정렬 세부 정보

Arguments with collation specifications currently aren’t supported.

다음 예제에서는 IN 함수를 사용합니다.

단순 리터럴과 함께 IN 사용하기

다음 예는 단순 리터럴과 함께 IN 및 NOT IN 을 사용하는 방법을 보여줍니다.

SELECT 1 IN (1, 2, 3) AS RESULT;
Copy
+--------+
| RESULT |
|--------|
| True   |
+--------+
SELECT 4 NOT IN (1, 2, 3) AS RESULT;
Copy
+--------+
| RESULT |
|--------|
| True   |
+--------+

하위 쿼리와 함께 IN 사용하기

이 예에서는 하위 쿼리에서 IN 을 사용하는 방법을 보여줍니다.

SELECT 'a' IN (
  SELECT column1 FROM VALUES ('b'), ('c'), ('d')
  ) AS RESULT;
Copy
+--------+
| RESULT |
|--------|
| False  |
+--------+

테이블과 함께 IN 사용하기

이들 예에서는 테이블과 함께 IN 을 사용하는 방법을 보여줍니다. 아래 문을 실행하면 예제에서 사용하는 테이블이 생성됩니다.

CREATE OR REPLACE TABLE in_function_demo (
  col_1 INTEGER,
  col_2 INTEGER,
  col_3 INTEGER);

INSERT INTO in_function_demo (col_1, col_2, col_3) VALUES
  (1, 1, 1),
  (1, 2, 3),
  (4, 5, NULL);
Copy

이 예에서는 테이블의 단일 열과 함께 IN 을 사용하는 방법을 보여줍니다.

SELECT col_1, col_2, col_3
  FROM in_function_demo
  WHERE (col_1) IN (1, 10, 100, 1000)
  ORDER BY col_1, col_2, col_3;
Copy
+-------+-------+-------+
| COL_1 | COL_2 | COL_3 |
|-------+-------+-------|
|     1 |     1 |     1 |
|     1 |     2 |     3 |
+-------+-------+-------+

이 예에서는 테이블의 여러 열과 함께 IN 을 사용하는 방법을 보여줍니다.

SELECT col_1, col_2, col_3
  FROM in_function_demo
  WHERE (col_1, col_2, col_3) IN (
    (1,2,3),
    (4,5,6));
Copy
+-------+-------+-------+
| COL_1 | COL_2 | COL_3 |
|-------+-------+-------|
|     1 |     2 |     3 |
+-------+-------+-------+

이 예에서는 테이블의 여러 열을 읽는 하위 쿼리와 함께 IN 을 사용하는 방법을 보여줍니다.

SELECT (1, 2, 3) IN (
  SELECT col_1, col_2, col_3 FROM in_function_demo
  ) AS RESULT;
Copy
+--------+
| RESULT |
|--------|
| True   |
+--------+

NULL 사용하기

NULL != NULL임을 기억하세요. NULL는 알 수 없는 값을 나타내므로 NULL(동등 조건 포함)과의 비교가 포함된 IN 및 NOT IN 목록은 예기치 않은 결과를 생성할 수 있습니다. NULL과의 비교는 TRUE 또는 FALSE를 반환하지 않고 NULL을 반환합니다. 3진 논리 도 참조하십시오.

예를 들어, 다음 쿼리는 TRUE가 아닌 NULL을 반환합니다. SQL은 NULL이 다른 NULL을 포함한 모든 값과 같은지 여부를 결정할 수 없기 때문입니다.

SELECT NULL IN (1, 2, NULL) AS RESULT;
Copy
+--------+
| RESULT |
|--------|
| NULL   |
+--------+

NULL이 아닌 ``1``을 선택하도록 쿼리를 변경하면 TRUE를 반환합니다.

SELECT 1 IN (1, 2, NULL) AS RESULT;
Copy
+--------+
| RESULT |
|--------|
| True   |
+--------+

이 경우 결과는 TRUE입니다. ``1``과 일치하는 항목이 IN 목록에 있기 때문입니다. NULL이 IN에도 존재한다는 사실은 결과에 영향을 주지 않습니다.

마찬가지로, NULL과의 NOT IN 비교는 목록의 값이 NULL인 경우에도 NULL을 반환합니다.

SELECT 1 NOT IN (1, 2, NULL) AS RESULT;
Copy
+--------+
| RESULT |
|--------|
| NULL  |
+--------+

다음 쿼리에 대해서도 동일한 동작이 적용되며, 여기서 값 세트 4, 5, NULL``은 ``4, 5, NULL 또는 ``7, 8, 9``와 일치하지 않습니다.

SELECT (4, 5, NULL) IN ( (4, 5, NULL), (7, 8, 9) ) AS RESULT;
Copy

다음 예는 NULL 비교와 동일한 동작을 보여주지만 하위 쿼리를 사용하여 비교되는 IN 목록 값을 정의합니다.

CREATE OR REPLACE TABLE in_list_table (
  val1 INTEGER,
  val2 INTEGER,
  val3 INTEGER
);

INSERT INTO in_list_table VALUES (1, 10, NULL), (2, 20, NULL), (NULL, NULL, NULL);

SELECT 1 IN (SELECT val1 FROM in_list_table) AS RESULT;
Copy
+--------+
| RESULT |
|--------|
| True   |
+--------+
SELECT NULL IN (SELECT val1 FROM in_list_table) AS RESULT;
Copy
+--------+
| RESULT |
|--------|
| NULL   |
+--------+
SELECT 3 IN (SELECT val1 FROM in_list_table) AS RESULT;
Copy
+--------+
| RESULT |
|--------|
| NULL   |
+--------+