CUBRID와 Oralce에서 ''에 대한 사용 시 차이점에 대한 설명을 위해 예제를 이용하여 설명하겠다.
기본적으로 CUBRID에서는 ''(공백)과 NULL을 엄격히 구분하지만 Oralce에서는 ''(공백)과 NULL을 동일하게 사용한다. 이에 따라 발생하는 문제를 예시로 하여 설명하도록 하겠다.
예시를 위한 Sample table과 Data는 아래와 같다.
create table tbl (a int, b char(1));
insert into tbl values(1,'A');
insert into tbl values(2,'B');
insert into tbl values(1,'C');
insert into tbl values(4,'');
insert into tbl values(5,NULL);
위의 입력 데이터를 대상으로 사용할 쿼리는 아래와 같으며 각 쿼리의 결과 값은 CUBRID와 Oralce로 나눠서 설명하도록 하겠다.
예제 1
select max(decode(a,1,b,''))||max(decode(a,2,'+'||b,''))||max(decode(a,3,'+'||b,'')) result from tbl;
=== <Result of SELECT Command in Line 1> ===
result
======================
'C+B'☞ 결과가 동일하다. max의 경우 ''보다 b칼럼의 값이 크게 나오기 때문이다. b칼럼에 ''값이 들어가 있다면 위의 쿼리에서는 의미없는 값이므로 무시한다.
예제 2
select min(decode(a,1,b,''))||min(decode(a,2,'+'||b,''))||min(decode(a,3,'+'||b,'')) result from tbl;
CUBRID의 결과
=== <Result of SELECT Command in Line 2> ===
result
======================
''
Oracle의 결과
RESUL
-----
A+B☞ 결과가 다르다. CUBRID결과에서 decode로 가져온 칼럼 b의 모든 결과 값이 ''보다 크기 때문에 min함수에 의한 값은 항상 ''이 나오게 되고 모든 값이 ''이므로 최종 결과 값은 ''이 나오게 된다. Oracle의 경우 ''는 NULL로 정의 되고 NULL은 다른 값과 비교 대상이 되지 않는다. 따라서 NULL을 제외한 값들 중 min값을 뽑아 내기 때문에 결과가 다르게 나온다.
예제 3
select min(decode(a,1,b,NULL))||min(decode(a,2,'+'||b,NULL))||nvl(min(decode(a,3,'+'||b,NULL)),'') result from tbl;
CUBRID의 결과
=== <Result of SELECT Command in Line 3> ===
result
======================
'A+B'
Oracle의 결과
RESUL
-----
A+B☞ 결과 값이 동일하다. min함수를 이용하여 사용할 때 CUBRID와 Oracle의 결과 값을 동일하게 가져오려면 위와 같이 추가적으로 nvl함수를 사용하여야 한다. nvl로 묶어주는 이유는 CUBRID에서는 ||연산에 NULL이 연산되면 모든 값은 NULL이 되기 때문이다. 이는 Oracle을 제외한 대부분의 DBMS에서의 방식과 동일하다.
예제 4
select max(b) from tbl;
select min(b) from tbl;CUBRID의 결과
=== <Result of SELECT Command in Line 13> ===
max(b)
======================
'C'...
min(b)
======================
' 'Oracle의 결과
MAX
----
C
MIN
----
A☞ 위의 결과 값을 보면 ''에 대한 CUBRID와 Oracle의 차이를 확연히 알 수 있을 것이다. CUBRID에서 ''(공백)을 사용할 때 Oracle에서 사용하는 것과 동일한 생각에서 사용한다면 원하는 결과 값을 얻을 수 없을 것이며 잘못된 계산값을 가져올 수 있게 된다.
* 해당 사항은 Oracle과 타 DBMS의 차이 중 하나로써 ''(공백)문자 사용에 주의를 기울여야 한다.