카테고리:

조건식 함수

[ NOT ] IN

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

참고

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

팁

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

구문

개별 값을 비교하려면:

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

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

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

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

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

매개 변수

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

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

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

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

데이터 정렬 세부 정보

Arguments with collation specifications currently aren’t supported.

예

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

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

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

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

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

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

SELECT 'a' IN (
  SELECT column1 FROM VALUES ('b'), ('c'), ('d')
  ) AS RESULT;
+--------+
| 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);

이 예에서는 테이블의 단일 열과 함께 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;
+-------+-------+-------+
| 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));
+-------+-------+-------+
| 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;
+--------+
| 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;
+--------+
| RESULT |
|--------|
| NULL   |
+--------+

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

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

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

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

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

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

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

다음 예는 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;
+--------+
| RESULT |
|--------|
| True   |
+--------+
SELECT NULL IN (SELECT val1 FROM in_list_table) AS RESULT;
+--------+
| RESULT |
|--------|
| NULL   |
+--------+
SELECT 3 IN (SELECT val1 FROM in_list_table) AS RESULT;
+--------+
| RESULT |
|--------|
| NULL   |
+--------+