반응형
오라클에서 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
그리드형
'IT > DB' 카테고리의 다른 글
[Oracle] 오라클 시퀀스(Sequence) 생성/수정/삭제/currval/nextval (0) | 2021.12.30 |
---|---|
[ORACLE] ORA-01732 : 뷰에 대한 조작이 부적합합니다. (0) | 2021.12.22 |
[ORACLE] NULL 값 정렬 (ORDER BY NULLS FIRST OR LAST) (0) | 2021.11.24 |
[ORACLE] DB Tool 한글 깨짐 현상 해결 방법(오렌지, Toad 등) (0) | 2021.11.24 |
[ORACLE] PL/SQL 에러 PLS-00363 : 프로시저 실행 안 될 때 해결방법 (0) | 2021.10.29 |
댓글