※ Oracle 오라클 DECODE 함수
- 특정 컬럼의 값을 기준으로 마치 IF문을 사용하는 것과 같은 효과를 내는 함수
- 해당 컬럼의 값이 'A'이면 지정한 특정한 값을 출력하고, 'B'이면 또 다른 값을 출력
- 기본값을 정해서 조건을 만족하지 않는 경우의 출력 제어 가능
- 구문
DECODE(expr, search, result, default)
-- expr과 각 search 값을 비교하녀 같으면 result 값을 반환, 다르면 default 값을 반환
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 이 이루어지게
이용될수도 있습니다.