본문 바로가기
Be Smart/SQL

[Oracle] 오라클 DECODE 함수 사용법

by 반월하 2021. 11. 29.
728x90

DECODE 함수는 오라클 쿼리에서 가장 많이 사용하는 함수 중 하나입니다.
표준 SQL 함수가 아니고 오라클 함수 이기 때문에 사용하기 꺼려할 수도 있지만 아주 편하기 때문에 매우 유용합니다.
최근에는 CASE WHEN 구문 사용을 권장하는 편 입니다.

DECODE 함수는 프로그래밍에서의 if else와 비슷한 기능을 수행한다. 간단한 사용법은 아래와 같다.
예) DECODE(칼럼, 조건 1, 결과 1, 조건 2, 결과 2, 조건 3, 결과 3.....................)

WITH temp AS (
  SELECT 'M' gender FROM dual UNION ALL
  SELECT 'F' gender FROM dual UNION ALL
  SELECT 'X' gender FROM dual 
)

SELECT gender
     , DECODE(gender, 'M', '남자', 'F', '여자', '기타') gender2
  FROM temp

활용 예제

 WITH SCOTT AS (
 SELECT 'JONES' ENAME, 'MANAGER' JOB FROM DUAL UNION ALL
 SELECT 'SCOTT' ENAME, 'ANALYST' JOB FROM DUAL UNION ALL
 SELECT 'KING' ENAME, 'PRESIDENT' JOB FROM DUAL
 )
 
 SELECT ENAME
 , JOB
 , DECODE(JOB, 'PRESIDENT', '경영자', 'MANAGER', '관리자', 'ANALYST', '분석가') JOB_KOR
 FROM SCOTT

 WITH CITY AS (SELECT 'KING' ENAME,
               '10' DEPTNO
        FROM   DUAL
        UNION ALL
SELECT 'JONES' ENAME,
               '20' DEPTNO
        FROM   DUAL
        UNION ALL
SELECT 'ALLEN' ENAME,
               '30' DEPTNO
        FROM   DUAL )
SELECT ENAME ,
       DEPTNO ,
       DECODE(DEPTNO, '10', 'NEW YORK', '20', 'DALLAS', 'NONE') LOC
FROM   CITY

 WITH EMP AS (SELECT 'KING' ENAME,
               '' COMM
        FROM   DUAL
        UNION ALL
SELECT 'JONES' ENAME,
               '' COMM
        FROM   DUAL
        UNION ALL
SELECT 'ALLEN' ENAME,
               '300' COMM
        FROM   DUAL )
SELECT ENAME ,
       COMM ,
       DECODE(COMM, NULL, 'N', 'Y') COMM_YN
FROM   EMP

 WITH CITY AS (SELECT 'KING' ENAME,
               '10' DEPTNO
        FROM   DUAL
        UNION ALL
SELECT 'JONES' ENAME,
               '20' DEPTNO
        FROM   DUAL
        UNION ALL
SELECT 'ALLEN' ENAME,
               '30' DEPTNO
        FROM   DUAL )
SELECT ENAME ,
       DEPTNO ,
       DECODE(DEPTNO, '10', 'NEW YORK'
                    , '20', 'DALLAS'
                    , '30', 'CHICAGO'
                    , '40', 'BOSTON') LOC
FROM   CITY

-> 조건이 많을 경우 줄 바꿈을 하여 쿼리를 작성할 것을 권장한다.

 WITH SCOTT AS (
 SELECT 'SCOTT' ENAME, 'ANALYST' JOB, '7876' MGR FROM DUAL UNION ALL
 SELECT 'FORD' ENAME, 'ANALYST' JOB, '7900' MGR FROM DUAL UNION ALL
 SELECT 'ADAMS' ENAME, 'CLERK' JOB, '7934' MGR FROM DUAL UNION ALL
 SELECT 'JAMES' ENAME, 'CLERK' JOB, '7902' MGR FROM DUAL UNION ALL
 SELECT 'MILLER' ENAME, 'CLERK' JOB, '7788' MGR FROM DUAL
 )
 SELECT ENAME, JOB
 , DECODE(JOB, 'CLERK', DECODE(MGR, '7788', 'SCOTT'
                                  , '7934', 'BLAKE'
                                  , '7902', 'CLARK')
             , 'ANALYST', DECODE(MGR, '7876', 'JONES'
                                    , '7900', 'BLAKE')) MGRNAME
 FROM SCOTT

-> DECODE 함수 내부에 또 다른 DECODE 함수를 사용할 수 있다

-> 월별, 일별 통계를 산출하거나, 행을 열로 바꿀 때 유용하다

DECODE 함수는 조건이 많아지면 쿼리의 가독성이 떨어지고 차후 유지보수가 힘들다. 그리고 DECODE 함수 내부에 또 다른 DECODE 함수를 사용하는 건 최악의 쿼리가 될 수 있으므로 사용을 자제하는 것이 좋다.

 

728x90

댓글