본문 바로가기
Dev/Oracle

[Oracle] DECODE, CASE

by 흰바다제비 2022. 6. 6.
728x90

SQL 문장에서 조건에 해당하는 값을 추출하고자 할 때 사용

 

1. DECODE

조건에 따라 데이터를 다른 값이나 컬럼값으로 추출할 수 있다.

 

- 부서번호별 이름을 지정해서 출력

SELECT DEPTNO, DECODE(DEPTNO, 10, 'ACCOUNTING',
                              20, 'RESEARCH',
                              30, 'SALES', 'OPERATIONS') NAME
FROM DEPT;

 

- 10 부서의 급여 합계, 20 부서의 최대값, 30 부서의 최소값

SELECT DEPTNO, DECODE(DEPTNO, 10, SUM(SAL),
                              20, MAX(SAL),
                              30, MINL(SAL)) SAL
FROM EMP
GROUP BY DEPTNO;

 

- 부서별 급여 합계

SELECT DEPTNO, NVL(SUM(DECODE(DEPTNO, 10, SAL)),0) DEPTNO10, -- 부서번호 10에 해당하는 급여의 합, 다른 번호는 해당이 없으니 0으로 출력
              NVL(SUM(DECODE(DEPTNO, 20, SAL)),0) DEPTNO20,
              NVL(SUM(DECODE(DEPTNO, 20, SAL)),0) DEPTNO20,
              NVL(SUM(DECODE(DEPTNO, 30, SAL)),0) DEPTNO30,
              NVL(SUM(DECODE(DEPTNO, 40, SAL)),0) DEPTNO40
FROM EMP
GROUP BY DEPTNO;

 

- NVL : 값이 NULL인 경우 지정값 출력

 

- 부서별 급여 합계 : 행으로 출력

SELECT D.DEPTNO, NVL(SUM(E.SAL),0) SAL
FROM EMP E, DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO
GROUP BY D.DEPTNO;

- 부서별 급여 합계 : 열로 출력

SELECT MAX(NVL(SUM(DECODE(DEPTNO, 10, SAL)),0)) DEPTNO10,
      MAX(NVL(SUM(DECODE(DEPTNO, 20, SAL)),0)) DEPTNO20,
      MAX(NVL(SUM(DECODE(DEPTNO, 30, SAL)),0)) DEPTNO30,
      MAX(NVL(SUM(DECODE(DEPTNO, 40, SAL)),0)) DEPTNO40
FROM EMP
GROUP BY DEPTNO;

 

 

 

 

2. CASE

조건 연산자를 모두 사용할 수 있어 추가로 함수 사용 없이 비교연산을 수행할 수 있다.

 

- 부서번호별 이름을 지정해서 출력

- 첫번째 예제를 DECODE -> CASE 변경

SELECT DEPTNO,
        CASE DEPTNO
            WHEN 10 THEN 'ACCOUNTING'
            WHEN 20 THEN 'RESEARCH'
            WHEN 30 THEN 'SALES'
            ELSE 'OPERATIONS'
        END AS DEPT_NAME
FROM DEPT;

 

- 급여별 다른 인상율 적용

SELECT ENAME,
        CASE
            WHEN SAL < 1000 THEN SAL+(SAL*0.8)
            WHEN SAL BETWEEN 1000 AND 2000 THEN SAL+(SAL*0.5)
            WHEN SAL BETWEEN 2001 AND 3000 THEN SAL+(SAL*0.3)
            ELSE SAL+(SAL*0.1)
        END SAL
FROM EMP;

 

- 직업별 다른 인상율 적용

SELECT ENAME, JOB,
        CASE JOB
            WHEN 'CLERK' THEN SAL+(SAL*0.3)
            WHEN 'SALESMAN' THEN SAL+(SAL*0.5)
            WHEN 'MANAGER' THEN SAL+(SAL+0.4)
            ELSE SAL+(SAL*0.2)
        END JOB
FROM EMP;
728x90

'Dev > Oracle' 카테고리의 다른 글

[Oracle] Oracle Lock Test  (0) 2022.06.10
[Oracle] HWM (High Water Mark)  (0) 2022.06.09
[Oracle] PCTFREE, PCTUSED  (0) 2022.06.09
[Oracle] 사용자, 권한, 롤  (0) 2022.06.08
[Oracle] 아카이브 모드, 리두로그  (0) 2022.06.07

댓글