프린트 하기

OS환경 : Oracle Linux 7.6 (64bit)

 

DB 환경 : Oracle Database 19.10.0.0

 

방법 : 오라클 19c not in 절에 null 허용 컬럼 관련 테스트

오라클에서 아래와 같은 샘플데이터가 있을때 not in 절로 해당 데이터를 확인하는 쿼리로 테스트해봄

현재 아래 테이블에는 각각 1~8까지 데이터가 동일하게 들어있고, tab_1 테이블에만 111이라는 추가 데이터가 들어있음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SQL> 
drop table tab_1;
drop table tab_2;
drop table tab_3;
drop table tab_4;
create table tab_1 (col_1 number);
insert into tab_1 values (1);
insert into tab_1 values (2);
insert into tab_1 values (3);
insert into tab_1 values (4);
insert into tab_1 values (5);
insert into tab_1 values (6);
insert into tab_1 values (7);
insert into tab_1 values (8);
insert into tab_1 values (NULL);
commit;
create table tab_2 as select * from tab_1;
create table tab_3 as select * from tab_1;
create table tab_4 as select * from tab_1;
insert into tab_1 values (111);
commit;

 

 

 

여기서 tab_2, tab_3, tab_4 를 union all 하여 col_1 값이 tab_1에 있는지 체크하는 쿼리 수행

아래 쿼리대로라면 tab_2, tab_3, tab_4 에 존재하는 1~8은 안나오고 111만 나와야함

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SQL> 
select col_1 from tab_1 
where col_1 not in  
select col_1 from tab_2 where col_1 is not null 
union all 
select col_1 from tab_3 where col_1 is not null 
union all 
select col_1 from tab_4 where col_1 is not null 
);
 
      COL1
----------
         0

하지만 데이터가 0으로 나옴

 

 

이유는 NULL 조건에 있음

tab_1~4까지 모두 col_1 컬럼이 null 허용 컬럼임

null은 in이나 not in 절, = 등으로 비교가 되지 않기 때문에 꼭 is not null, is null 등으로 비교해줘야함

 

 

위 쿼리에서 서브쿼리에 모두 col_1 is not null을 넣은 후 다시 조회

1
2
3
4
5
6
7
8
9
10
11
12
13
SQL> 
select col_1 from tab_1
where col_1 not in 
(
select col_1 from tab_2 where col_1 is not null
union all
select col_1 from tab_3 where col_1 is not null
union all
select col_1 from tab_4 where col_1 is not null
);
      COL1
----------
       111

정상적으로 tab_1에만 존재하는 111이 나옴

NULL 허용 컬럼으로 조회시 이 점을 유의해서 sql을 작성해야함

 

 

참조 :