본문 바로가기

개발

NOT IN 절에 NULL 을 넣으면 동작을 제대로 안한다.

null 은 값이 아니라 UNKNOWN 이다. 

 

SELECT *
FROM UNNEST([1,2,3]) i
WHERE i NOT IN UNNEST([2,3,null])

위 쿼리를 빅쿼리에서 돌리면 어떤 결과가 나올까?

 

1이 나올까? 

 

아니, 값이 안나온다. There is no data to display 메시지는 볼 수 있다

 

이번엔 MySQL 에서 테스트해보자

 

users 테이블엔 Hello World 가 들어가있다. Hello 인 행은 t 가 null 이고 World 인 행은 t 가 exist 다. 

참고로 둘다 VARCHAR 값이다. null 은 null 일뿐...

Where 조건을 

t is null

로 하면 값이 나오지만 

 t NOT IN (null)

을 하면 아예 값이 안나온다. 왜??? 분명 "exist" 는 null 이 아닌데!!

 

문제는 null 이 값이 아니라 UNKNOWN 이라는 점이다. NOT IN 연산은 AND 조건을 무수히 붙인 것에 지나지않는다.

 

예를 들어서

user_id NOT IN (1,2,3) 이라는 조건을 풀어서 쓰면

user_id != 1 AND user_id != 2 AND user_id != 3 이 된다. 

 

그런데 null 은 UNKNOWN 이니까 user_id != UNKNOWN 이든 user_id = UNKNOWN 이든 둘다 이상하다. 그 결과 아무런 값이 안나온다.

그래서 null 을 UNKNOWN 이 아니라 STRING 값으로 바꿔주면 우리가 원하던 exist 가 나온다.