(Oracle PostgreSQL변환) Oracle의 DECODE함수를 PostgreSQL의 CASE WHEN THEN문으로 대체하기

Oracle DB

DECODE 함수는 Oracle과 PostgreSQL에서 함수 사용법에 차이가 있습니다. 본 글에서는 Oracle의 DECODE 함수를 PostgreSQL에서 어떠한 명령으로 대체하여 동일한 결과를 도출할 수 있는지를 설명합니다.

DECODE 함수 Oracle과 PostgreSQL비교

Oracle과 PostgreSQL에서 사용되는 DECODE함수에 대한 차이점은 다음과 같습니다.

Oracle DECODE함수 사용법

Oracle에서는 다음과 같이 조건 분기문으로 사용됩니다. numeric 타입 no 항목에 대해 2로 나눈 나머지를 구하는 함수 mod(no, 2)의 계산 결과가 0이면 even을 출력하고 1이면 odd를 출력합니다.

다음 ddl, dml문으로 1, 2, 3, 4, 5 데이터를 작성합니다.

create table testtable (
 no numeric
);
insert into testtable values ( 1 );
insert into testtable values ( 2 );
insert into testtable values ( 3 );
insert into testtable values ( 4 );
insert into testtable values ( 5 );

다음 SQL문으로 no 항목의 1, 2, 3, 4, 5 데이터를 대상으로 2로 나눈 나머지를 구하는 함수 mod(no, 2)를 실행합니다.

SQL> select mod(no,2) from testtable;
 MOD(NO,2)
----------
         1
         0
         1
         0
         1

DECODE 함수는 mod(no,2) 계산 결과가 0이면 even을 출력하고 1이면 odd를 출력합니다.

SQL> SELECT DECODE(mod(no,2),0,'even',1,'odd') from testtable;
DECODE(M
--------
odd
even
odd
even
odd

PostgreSQL DECODE함수 사용법

PostgreSQL에서는 다음과 같이 암호화/복호화 함수로서 사용됩니다.

C:\> psql -d postgres
# select encode('Zinnunkebi.com','base64');
        encode
----------------------
 WmlubnVua2ViaS5jb20=
(1개 행)

# select decode('WmlubnVua2ViaS5jb20=','base64');
             decode
--------------------------------
 \x5a696e6e756e6b6562692e636f6d
(1개 행)

# select encode(decode('WmlubnVua2ViaS5jb20=','base64'),'escape');
     encode
----------------
 Zinnunkebi.com
(1개 행)

Oracle DECODE함수에 대한 PostgresSQL의 대체 명령

PostgreSQL에서 DECODE 함수를 사용하면 다음과 같이 ERROR가 발생합니다.

C:\> psql -d postgres
# SELECT DECODE(mod(no,2),0,'even',1,'odd') from testtable;
ERROR:  function decode(numeric, integer, unknown, integer, unknown) does not exist
줄 1: SELECT DECODE(mod(no,2),0,'even',1,'odd') from testtable;
             ^
힌트:  No function matches the given name and argument types. You might need to add explicit type casts.

PostgreSQL에서 SQL문에 조건식을 사용하려면 CASE WHEN THEN ELSE END문을 사용합니다.

# select CASE mod(no,2) WHEN 0 THEN 'even' WHEN 1 THEN 'odd' END FROM testtable;
 case
------
 odd
 even
 odd
 even
 odd
(5개 행)

결론

Oracle의 DECODE: 조건에 따라 값을 반환하는 함수입니다.
PostgreSQL의 DECODE: 데이터 포맷을 다른 포맷으로 변환하는 함수입니다 (예: base64를 일반 텍스트로).
PostgreSQL에서 Oracle의 DECODE와 같은 로직을 구현하려면 CASE 구문을 사용해야 합니다.

댓글

タイトルとURLをコピーしました