개발
NOT IN 절에 NULL 을 넣으면 동작을 제대로 안한다.
우리로
2023. 8. 25. 01:17
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 가 나온다.