본문 바로가기
IT/DB

[ORACLE] 널(NULL)에 대한 IN과 NOT IN

by 스터딩아재 2021. 11. 27.
반응형

 

오라클에서 WHERE 절에 IN이나 NOT IN을 쓰는 경우가 많다. IN () 다음의 괄호에는 1000건 이상이 들어가면 에러가 난다. 이 문제는 바로 에러가 터지기 때문에 미리 알기 쉬운데, 비교값에 NULL이 들어가는 문제는 당장 SQL에러가 나진 않기 때문에 알기 어렵습니다. 이번에 업무에서 유사한 사례로 조회돼야 할 건이 누락되어 공유합니다.

 

 

IN, NOT IN NULL 문제 예시

아래와 같이 매장 테이블이 있고, 영업여부를 조건으로 조회하는 쿼리를 예로 들어보자.

홍대점의 영업여부가 NULL이 들어가 있다.

 

[매장 TABLE]

영업여부 매장명
Y 강남점
N 용산점
  홍대점

 

IN의 경우

아래와 같은 쿼리를 작성하면 강남점과 홍대점이 나와야 될 것 같지만, NULL은 나오지 않는다. 

 

NULL은 IN으로 비교가 되지 않고, IS NULL로 비교해야하기 때문이다.

 

SELECT 매장명
FROM   상품TBL
WHERE  영업여부 IN ('Y', NULL)
;

-- 결과
강남점

 

 

NOT IN의 경우

아래 SQL은 'N' NOT IN이라고 하면 Y와 NULL인 강남점 홍대점이 나오거나 강남점만 나와야 될 것 같지만, 아무 ROW도 나오지 않습니다.

 

NULL을 비교하면서 NOT IN 조건 전체가 false가 되버리기 때문입니다.

 

SELECT 판매상품명
FROM   매장상품TBL
WHERE  'N' NOT IN (SELECT 영업여부 FROM 매장TBL)
;

-- 결과
no row

 

  

 

이 상황은 쉽게 발견하기 어려워 한참을 찾아야 알게 되는 경우가 많습니다.

테이블의 NOT NULL 속성이 얼마나 중요한지와 NOT NULL 속성이 아닌 컬럼은 IN, NOT IN 사용 시 주의해야겠습니다.

 

 

NULL의 비교는 IS NULL, IS NOT NULL

그리드형

댓글