본문 바로가기

데이터베이스/Oracle

IN과 NOT IN의 함정


1. IN 의 함정

-hobby가 null 이거나 '낚시'인 경우를 in을 이용하여 표현하면 다음과 같다.


hobby in ( null, '낚시')


hobby가 null 이거나 '낚시'인 row들이 선택될 것이라 기대하지만, 결과는 '낚시'인 경우만 선택된다. 

왜일까? 위 query를 where문으로 풀어보면 다음과 같다.


where hobby = null

or hobby = '낚시'


null은 is null 이나 is not null 로 비교되어야 하는데 hobby = null로 비교되었다. 따라서 hobby = null 은 false만 반환하므로 hobby = '낚시' 인 row만 선택되는 것이다.


2. NOT IN 의 함정

- hobby가 null 또는 '낚시' 모두에 속하지 않는 경우를 not in을 이용하여표현하면 다음과 같다.


hobby not in(낚시, null)


hobby가 낚시가 아니고, null이 아닌 row들이 선택될 것이라 기대하지만, 결과는 아무 row도 선택되지 않는다.

왜일까? 위 query를 where문으로 풀어보면 다음과 같다.


where hobby <> null

and hobby <> '낚시'


즉, null은 비교될 때 is null 이나 is not null로 비교되어야 하므로 hobby <> null 은 항상 false를 반환하게된다.

따라서 and 조건문에 의해 아무 row도 선택되지 않는 것이다.