설문조사
PostgreSQL/PPAS 관련 듣고 싶은 교육은


총 게시물 94건, 최근 0 건
   

널또는 empty string('') 과 || 이용시 주의 사항!!

글쓴이 : PostgresDBA 날짜 : 2013-07-04 (목) 14:31 조회 : 12200
메인 강좌에 앞서 기본적인 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;
 a | b  | c
---+----+----
 a | a  | aX
   |    | X
   | 널 | 널
 b | b  | bX
(4 rows)

오라클과 결과가 많이 틀리죠?
여기서 두가지를 알수 있습니다.
첫번째 PostgreSQL 에서 '' 은 절대 널이 아니다. (이미 언급했습니다. 위에서^^)
둘째 PostgreSQL 에서는 널과 문자를 ||로 결합시키면, 오라클과 달리 해당 결과 또한 널이 된다는 점입니다.  

다른 예제를 한번 더 들어보겠습니다.
오라클에서는
SELECT NULL||'%' FROM DUAL;    ======> '%' 반환
SELECT CONCAT(NULL,'%') FROM DUAL; ======> '%' 반환

PostgreSQL 에서는
scottdb=> SELECT CONCAT(NULL,'%') ; ======> '%' 반환
 concat
--------
 %
(1 row)


scottdb=> SELECT NULL||'%' ;  ======> 널 반환
 ?column?
----------

(1 row)

주의 하세요!

참고로 PostgreSQL Plust Advanced Server(PPAS) 에서는 
edb_redwood_strings=TRUE 이런 패러미터 세팅을 하면
오라클과 똑같이 동작합니다.
보통, PPAS 를 사용하는 싸이트에서는 이 패러미터를 true 로 해서 씁니다.

초보 2016-07-11 (월) 17:14
위와같은 함수중 + 기능을 가진함수 없을까요..?
두개의값을 더하고싶은데, 이런경우는 +를 쓰면 에러가나더군요.
(b.MAX_SERIAL_NUM + ROWNUM)
방법.. 알려주시면 감사하겠습니다..ㅎㅎ
댓글주소
     
     
주킹 2016-07-11 (월) 17:18
에러가 나는 경우는 .. .MAX_SERIAL_NUM 컬럼이 varchar 타입이고 숫자데이터가 들가신걸로 보여지는데...

select b.MAX_SERIAL_NUM::numeric + ROWNUM from table명; 해보세요
댓글주소
   

postgresdba.com