Database/Oracle
[Oracle] DECODE, CASE-WHEN
best
2016. 2. 18. 15:54
DECODE
IF문과 비슷한 의미
DECODE(A, B, 'C') : A와 B가 같다면 'C'를 출력한다.
DECODE 함수 안에 DECODE 함 수를 중첩해서 사용 할 수도 있다.
CASE-WHEN
DECODE와 비슷하지만 비교연산을 할 수 있다는 장점이 있고, 조건을 만족하면 값이 아닌 쿼리를 수행 할 수도 있다.
EX ) WHEN 100 = (SELECT 98 FROM DUAL) THEN
DUAL은 의미하는게 없다.
실습1 : 직업이 AD_PRESS 인 사람은 A 등급을,
ST_MAN 인 사람은 B 등급을,
IT_PROG 인 사람은 C 등급을,
SA_REP 인 사람은 D 등급을,
ST_CLEAK 인 사람은 E 등급을
기타는 0 을 부여하여 조회한다.
이를 DECODE와 CASE-WHEN을 이용하여 풀어 볼 수 있다.
1. DECODE를 이용한 풀이
1
2
3
4
5
6
7
8
9
10
11 |
SELECT EMPLOYEE_ID
,LAST_NAME
,DECODE(JOB_ID
, 'AD_PRESS', 'A'
, 'ST_MAN', 'B'
, 'IT_PROG', 'C'
, 'SA_REP', 'D'
, 'ST_CLEAK', 'E'
, '0') JOB_GRADE
FROM EMPLOYEES
WHERE JOB_GRADE = 'B' -- VIEW나 TABLE에 존재하지 않는 컬럼은 조회할 수 없으므로 VIEW가 필요하다. |
cs |
2. DECODE와 VIEW를 사용 1번의 제한을 해결
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 |
SELECT *
FROM (
SELECT EMPLOYEE_ID
,LAST_NAME
,DECODE(JOB_ID
, 'AD_PRESS', 'A'
, 'ST_MAN', 'B'
, 'IT_PROG', 'C'
, 'SA_REP', 'D'
, 'ST_CLEAK', 'E'
, '0') JOB_GRADE
FROM EMPLOYEES
)
WHERE JOB_GRADE = 'B'
; |
cs |
3. CASE-THEN 을 이용한 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 |
SELECT ROWNUM
,EMPLOYEE_ID
,LAST_NAME
, CASE JOB_ID
WHEN 'AD_PRESS' THEN
'A'
WHEN 'ST_MAN' THEN
'B'
WHEN 'IT_PROG' THEN
'C'
WHEN 'SA_REP' THEN
'D'
WHEN 'ST_CLEAK' THEN
'E'
ELSE '0'
END
FROM EMPLOYEES
; |
cs |
ROWNUM 은 줄 번호를 출력한다.