Posted
Filed under ORACLE
 [원문] http://develop.sunshiny.co.kr/122

※ Oracle 오라클 DECODE 함수

- 특정 컬럼의 값을 기준으로 마치 IF문을 사용하는 것과 같은 효과를 내는 함수
- 해당 컬럼의 값이 'A'이면 지정한 특정한 값을 출력하고, 'B'이면 또 다른 값을 출력
- 기본값을 정해서 조건을 만족하지 않는 경우의 출력 제어 가능

- 구문
DECODE(expr, search, result, default)
-- expr과 각 search 값을 비교하녀 같으면 result 값을 반환, 다르면 default 값을 반환

# 사원 번호(DEPTNO)에 따른 인상 급여

SELECT ENAME, DEPTNO, SAL,
    DECODE(DEPTNO
    ,10, SAL*1.05
    ,20, SAL*1.1
    ,30, SAL*1.15
    ,SAL)AS "인상급여"
FROM EMP;

ENAME, DEPTNO, SAL, 인상급여
----------------------------
SMITH   20    800   880
ALLEN   30    1600   1840
WARD    30    1250    1437.5
JONES   20    2975   3272.5
MARTIN  30    1250  1437.5
BLAKE   30    2850   3277.5
CLARK   10    2450   2572.5
SCOTT   20    3000   3300
KING    10    5000    5250
TURNER  30    1500  1725
ADAMS   20    1100   1210
JAMES   30    950     1092.5
FORD    20    3000    3300
MILLER  10    1300  1365



# 직업 이름(JOB)에 따라 새로운 직업명을 변형

SELECT ENAME, JOB,
        DECODE(JOB
    ,'ANALYST', '분석가'
    ,'CLERK', '점원'
    ,'MANAGER','관리자'
    ,'SALESMAN', '영업사원'
    ,'PRESIDENT', '사장님')AS NEW_JOB
FROM EMP;

ENAME,     JOB,      NEW_JOB
-----------------------------
SMITH   CLERK         점원
ALLEN   SALESMAN      영업사원
WARD    SALESMAN      영업사원
JONES   MANAGER       관리자
MARTIN  SALESMAN      영업사원
BLAKE   MANAGER       관리자
CLARK   MANAGER       관리자
SCOTT   ANALYST       분석가
KING    PRESIDENT     사장님
TURNER  SALESMAN      영업사원
ADAMS   CLERK         점원
JAMES   CLERK         점원
FORD    ANALYST       분석가
MILLER  CLERK         점원


참고 사이트 : http://stillrabbit.blogspot.com/2008/02/oracle-decode-tip.html

decode 문은 일반적으로 값을 치환하는데 쓰입니다.

* 컬럼 1개를 여러개의 값으로 비교할경우..
col1 의 값이 1,2,3 인경우 각각 'ONE', 'TWO', 'THREE' 로 변환하고자 한다면,

decode(col1, 1, 'ONE', 2, 'TWO', 3, 'THREE', 'MANY')

1,2,3 이 아닌경우는 'MANY' 가 되겠죠...

* 컬럼 여러개를 한개의 값으로 비교할경우

decode(2, col1, 'col1 is TWO', col2, 'col2 is TWO', null)

* 단방향 범위를 비교하는경우
만약 25 보다 큰경우엔 25 만 리턴하고 작은경우엔 해당컬럼의 값을
리턴하고자 한다면,

decode(sign(col1-25), -1, col1, 25)

처럼 사용하면 되겠죠.

* 다차원 통계에 응용(group by 와 조합)
그룹 아이디별로 합산하는 쿼리는 일반적으로 아래와같습니다.


select grp_id, sum(score)
from GRP_SCORE_TB
group by grp_id

만약..그룹별로 총계를 내고, 그룹별 총계 합산한 총합산을 내고싶다면?
다음과같이 카티션 곱을 응용하고, decode로 선택적인 그룹핑을 해주시면
됩니다.


select MAX(decode(gubun, 1, grp_id, '총계')),
sum(score)
from GRP_SCORE_TB
cross join (select level as gubun from dual connect by level < 3)
group by gubun, decode(gubun, 1, grp_id, null)

이려면,


a001 200
a004 122
a003 27
총계 347

과 같은 결과를 낼수 있습니다.

※ 몇가지 예로 decode 의 활용을 알아보았습니다. 이외에도 order by 등에도
사용하면, 위의 group by 에 사용한것처럼, 선택적인 sorting 이 이루어지게
이용될수도 있습니다.

2010/06/29 17:33 2010/06/29 17:33