Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL IN() 함수가 NULL을 반환하는 두 가지 경우

MySQL의 IN() 함수는 일반적으로 일치 여부에 따라 1(참) 또는 0(거짓)을 반환하지만, 특정 조건에서는 NULL을 반환할 수 있습니다. 이는 SQL에서 NULL과의 비교 결과가 '알 수 없음(UNKNOWN)'으로 처리되기 때문입니다. 아래에서 NULL이 반환되는 두 가지 대표적인 경우를 살펴보겠습니다.

Case 1: 왼쪽 표현식이 NULL인 경우

IN() 함수에서 비교 대상이 되는 왼쪽 표현식이 NULL이라면, 오른쪽 리스트에 어떤 값이 포함되어 있더라도 결과는 항상 NULL로 반환됩니다. 다음 예시를 통해 직접 확인해 보겠습니다.

mysql> Select NULL IN (1,2,3,4,10);
+----------------------+
| NULL IN (1,2,3,4,10) |
+----------------------+
|         NULL         |
+----------------------+
1 row in set (0.00 sec)

NULL은 어떤 값과도 같다고 판정할 수 없기 때문에, 리스트에 10이 포함되어 있음에도 불구하고 결과가 참(1)이나 거짓(0)이 아닌 NULL로 나오는 것입니다.

Case 2: 리스트에 NULL이 포함되어 있고 일치하는 값이 없는 경우

IN() 함수는 일치하는 값을 찾지 못한 상태에서 리스트 중 하나라도 NULL이 포함되어 있으면 NULL을 반환합니다. 반면, 리스트에 NULL이 있더라도 일치하는 값이 존재한다면 정상적으로 1을 반환합니다. 다음 두 예시를 비교해 보세요.

mysql> Select 10 IN (NULL,11,12);
+--------------------+
| 10 IN (NULL,11,12) |
+--------------------+
|        NULL        |
+--------------------+
1 row in set (0.00 sec)

mysql> Select 10 IN (NULL,11,12,10);
+-----------------------+
| 10 IN (NULL,11,12,10) |
+-----------------------+
|           1           |
+-----------------------+
1 row in set (0.00 sec)

첫 번째 쿼리에서는 10이 리스트에 없고 NULL이 포함되어 있어 NULL이 반환되었지만, 두 번째 쿼리에서는 리스트에 10이 존재하기 때문에 NULL과의 비교와 무관하게 1이 반환된 것입니다.

정리

  • 왼쪽 표현식이 NULL이면 → 결과는 항상 NULL
  • 리스트에 NULL이 포함되어 있고 일치하는 값이 없으면 → 결과는 NULL
  • 리스트에 NULL이 포함되어 있어도 일치하는 값이 있으면 → 결과는 1

따라서 실무에서 IN() 조건을 사용할 때는 컬럼 값이나 리스트 요소에 NULL이 포함될 가능성을 항상 염두에 두고, 필요하다면 IS NULL 조건을 함께 활용하는 것이 안전합니다.