데이터베이스/Oracle SQL

오라클 SQL과 PL/SQL ( 일반 함수 - 2 )

동띠기 2021. 7. 20. 00:09

CASE문

DECODE함수는 주로 =인 값을 처리하는데 사용합니다. 즉 크거나 작은 조건을 처리할 경우는 DECODE가 불편한 부분이 많은데 이런 부분을 CASE문에서 쉽게 처리가 가능합나다.
단 DECODE함수의 경우 내부에 , 로 조건이 구분 되었으나 CASE표현식 내부는 , 가 사용되지 않습니다.

DECODE와 동일하게 '=' 조건으로 사용되는 경우

STUDENT 테이블을 참조하여 DEPTNO1이 201번인 학생의 이름과 전화번호, 지역명을 출력하세요.
단 지역번호가 02면 SEOUL, 031 GYEONGGI, 051 BUSAN, 052 ULSAN, 055 HYEONGNAM , 나머지는 ETC로 출력하세요.

 

DECODE :
SELECT NAME, TEL, DECODE(SUBSTR(TEL, 0, INSTR(TEL, ')', 3) - 1), 02, 'SEOUL', 031, 'GYEONGGI', 051, 'BUSAN', 052, 'ULSAN', 055, 'GYEONGNAM','ETC') "LOC" 
FROM STUDENT 
WHERE DEPTNO1 = 201;



CASE :
SELECT NAME, TEL, 
CASE(SUBSTR(TEL, 1, INSTR(TEL, ')') -1) ) WHEN '02' THEN 'SEOUL' 
WHEN '031' THEN 'GYEONGGI' 
WHEN '051' THEN 'BUSAN' 
WHEN '052' THEN 'ULSAN' 
WHEN '055' THEN 'GYEONGNAM' 
ELSE 'ETC' 
END "LOC" 
FROM STUDENT 
WHERE DEPTNO1 = 201;



DECODE와 비교해보면 문법이 많이 복잡합니다. 그래서 대부분 = 조건은 DECODE를 사용합니다.

 

비교조건이 '=' 가 아닌 경우
STUDENT테이블의 JUIMIN 컬럼을 참조하여 학생들의 이름과 태어난 달, 그리고 분기를 출력하세요.
태어난 달이 01-03월은 1/4, 04-06월은 2/4, 07-09월은 3/4, 10-12월은 4/4로 출력하세요.


SELECT NAME, SUBSTR(JUMIN, 3, 2) "MONTH", CASE WHEN SUBSTR(JUMIN, 3, 2) BETWEEN '01' AND '03' THEN '1/4'
WHEN SUBSTR(JUMIN, 3, 2) BETWEEN '04' AND '06' THEN '2/4'
WHEN SUBSTR(JUMIN, 3, 2) BETWEEN '07' AND '09' THEN '3/4'
WHEN SUBSTR(JUMIN, 3, 2) BETWEEN '10' AND '12' THEN '4/4'
END "QUARTER"
FROM STUDENT;

CASE문은 SQL튜닝에서 아주 요긴하게 많이 사용되고 있으며 DECODE문과 비슷하지만 더 넓은 범위에서 사용할 수 있는 문법으로 꼭 기억하고 많은 연습이 필요합니다.

 

 

퀴즈 1.
EMP 테이블을 조회하여 EMPNO, ENAME, SAL, LEVEL(급여등급)을 아래와 같이 출력하세요.
단 급여등급은 SAL을 기준으로 1 - 1000이면 LEVEL 1, 1001 - 2000이면 LEVEL 2, 2001 - 3000이면 LEVEL 3, 3001-4000이면 LEVEL 4, 4001보다 많으면 LEVEL 5로 출력하세요

 

정답 : 

더보기

SELECT EMPNO, ENAME, SAL , CASE WHEN SAL >= 1 AND SAL <= 1000 THEN 'LEVEL 1'
WHEN SAL >= 1001 AND SAL <= 2000 THEN 'LEVEL 2'
WHEN SAL >= 2001 AND SAL <= 3000 THEN 'LEVEL 3'
WHEN SAL >= 3001 AND SAL <= 4000 THEN 'LEVEL 4'
WHEN SAL >= 4001 THEN 'LEVEL 5'
END "LEVEL"
FROM EMP
ORDER BY SAL DESC;

728x90