메인 강좌에 앞서 기본적인 2가지 사항 먼저 짚고 넘어가겠습니다.
첫번째)
먼저 COALESCE(a,b,c,....) 함수에 대해 설명하겠습니다.
이함수는 각종 RDBMS 의 공통적인 함수로서 입력된 인수들중 최초로 널이 아닌 값을 반환합니다.
인수가 단 둘이라면 즉 COALESCE(A,B) 이거는 오라클의 NVL(A,B) 와 동일합니다.
두번째)전에도 설명했듯이 오라클에서는 '' 은 널을 의미합니다.
하지만 PostgreSQL 에서는 '' 은 널이 절대 아닙니다. empty string 그 자체를 의미합니다.
이제 메인 주제로 넘어가겠습니다.
먼저 오라클에서의 결과를 살펴보겠습니다.
create table T1(a varchar(10));
insert into T1 values('a');
insert into T1 values('');
insert into T1 values(null);
insert into T1 values('b');
SQL> select a, coalesce(a,'널') B, coalesce(a||'X','널') C from T1;
A B C
--- --- ---
a a aX
널 X
널 X
b b bX
이제 동일한 쿼리를 PostgreSQL에서 수행하면 이떻게 될까요?
scottdb=> select a, coalesce(a,'널') B, coalesce(a||'X','널') C from T1;
오라클과 결과가 많이 틀리죠?
여기서 두가지를 알수 있습니다.
첫번째 PostgreSQL 에서 '' 은 절대 널이 아니다. (이미 언급했습니다. 위에서^^)
둘째 PostgreSQL 에서는 널과 문자를 ||로 결합시키면, 오라클과 달리 해당 결과 또한 널이 된다는 점입니다.
다른 예제를 한번 더 들어보겠습니다.
오라클에서는
SELECT NULL||'%' FROM DUAL; ======> '%' 반환
SELECT CONCAT(NULL,'%') FROM DUAL; ======> '%' 반환
PostgreSQL 에서는
scottdb=> SELECT CONCAT(NULL,'%') ; ======> '%' 반환
scottdb=> SELECT NULL||'%' ; ======> 널 반환
주의 하세요!
참고로 PostgreSQL Plust Advanced Server(PPAS) 에서는
edb_redwood_strings=TRUE 이런 패러미터 세팅을 하면
오라클과 똑같이 동작합니다.
보통, PPAS 를 사용하는 싸이트에서는 이 패러미터를 true 로 해서 씁니다.