4장 2절: DECODE 함수의 활용
※ DECODE 함수의 특징
- 프로그래밍 언어의 IF문을 SQL, PL/SQL 내에서 구현하기 위해 만들어진 오라클 함수.
- FROM 절을 제외한 나머지 절 전체(SELECT, GROUP BY, WHERE 등등)에 사용가능. --> 동적으로 FROM절의 TABLE을 선택할 수는 없다는 의미.
- 중복된 DECODE사용이 가능
- 단독으로 쓰이기보단 SIGN, LEAST, GREATEST 등의 함수, SUM, MAX, MIN 등의 GROUP 함수와 많이 쓰인다.
- DECODE는 최소 3개의 인수만 받을 수 있으며, 이 경우 내부적으로 NULL을 출력하는 ELSE로 처리한다.
따라서 아래 i)번과 ii)번은 같다.
예)
i) IF A = B THEN
RETURN 'T';
END IF;
==> DECODE(A,B,'T')
ii) IF A = B THEN
RETURN 'T';
ELSE
NULL
END IF;
==> DECODE(A,B,'T',NULL)
- 단순 상수뿐만 아니라 컬럼 간의 비교에도 유용하게 쓰일 수 있다.
예제) decode를 이용한 암호 생성
select to_char(sysdate,'DD')||decode(to_char(sysdate,'DAY'),'월요일','01','화요일','11','수요일','21','목요일','31','금요일','41','토요일','51','일요일','61') SEC_KEY from dual;
예제) decode가 sign과 함께 쓰이는 경우
==> decode는 부등호를 이용한 대소비교를 할 수 없기 때문에, 필요한 경우 sign, least 등의 함수로 대소비교 처리가 가능하게끔 해준다.
select lec_id,lec_time,lec_point,
decode(sign(lec_time-lec_point),0,'일반과목',1,'실험과목',-1,'기타과목') as ty from lecture;
select lec_id, lec_time, lec_point, decode(sign(lec_time-lec_point),1,'실험과목','일반과목') from lecture;
select lec_id,lec_time,lec_point, decode(least(lec_time,lec_point),lec_time,'일반과목','실험과목') from lecture;
-- 중첩된 DECODE의 사용 (중첩된 IF)
-- 예제: DECODE(A,B,DECODE(A,C,'T','F'),'F')
desc lecture;
select lec_id, lec_time, lec_point from lecture;
select lec_id, lec_time, lec_point, decode(lec_time,lec_point,decode(lec_time,3,'중요과목')) from lecture;
-- 연습문제 Q/A : 04-2
질문: TEMP의 행을 3개씩 묶어 하나의 번호를 부여하고, 해당 ROWNUM을 3으로 나눈 나머지가 1, 2, 0 인 경우로 나누어 컬럼의 위치를 정해주는 SQL을 만들어라.
select rownum, ceil(rownum/3) "no+", decode(mod(rownum,3),1,'A',2,'B',0,'C') as G, emp_id, emp_name from temp;
select ceil(rownum/3) COL1, decode(mod(rownum,3),1,emp_id) COL2, decode(mod(rownum,3),1,emp_name) COL3, decode(mod(rownum,3),2,emp_id) COL4
, decode(mod(rownum,3),2,emp_name) COL5, decode(mod(rownum,3),0,emp_id) COL7, decode(mod(rownum,3),0,emp_name) COL8
from temp;
-- 연습문제 Q/A : 04-3
(발전형) TEMP의 자료를 이용하여 한 행에 사번, 성명을 3명씩 (총 6개 컬럼) 보여주는 SQL을 작성하라.
select emp_id, emp_name from temp;
select ceil(rownum/3) COL1,
decode(mod(rownum,3),1,emp_id) COL2,
decode(mod(rownum,3),1,emp_name) COL3,
decode(mod(rownum,3),2,emp_id) COL4,
decode(mod(rownum,3),2,emp_name) COL5,
decode(mod(rownum,3),0,emp_id) COL7,
decode(mod(rownum,3),0,emp_name) COL8
from temp;
==>
select ceil(rownum/3) COL1,
max(decode(mod(rownum,3),1,emp_id)) COL2,
max(decode(mod(rownum,3),1,emp_name)) COL3,
max(decode(mod(rownum,3),2,emp_id)) COL4,
max(decode(mod(rownum,3),2,emp_name)) COL5,
max(decode(mod(rownum,3),0,emp_id)) COL7,
max(decode(mod(rownum,3),0,emp_name)) COL8
from temp
where emp_id>0
group by ceil(rownum/3);
- group by 절을 이용해 3명씩 그룹을 지어준다.
'Oracle_DB_Unix admin > (6)오라클 실습 (이채남 저)' 카테고리의 다른 글
4장: 사례 이해를 위한 필수 사항 (0) | 2016.03.01 |
---|---|
3-5장 ANY와 ALL (0) | 2016.03.01 |
CORERELATED 서브쿼리 (연관성 있는 서브쿼리) (0) | 2016.02.10 |