📚 Study/Oracle
Oracle :: CASE 조건문(CASE WHEN THEN ELSE END), DECODE(), 서브쿼리, 인라인뷰
bono-hye
2023. 10. 24. 22:59
(파일명 : 20231023_01_scott)
■ CASE 구문
- CASE WHEN THEN ELSE END
--○ CASE 구문(조건문, 분기문)
/*
CASE
WHEN
THEN
ELSE
END
*/
SELECT CASE 5+2 WHEN 4 THEN '5+2=4' ELSE '5+2는 몰라요' END
FROM DUAL;
--==>> 5+2는 몰라요
SELECT CASE 5+2 WHEN 7 THEN '5+2=7' ELSE '5+2는 몰라요' END
FROM DUAL;
--==>> 5+2=7
SELECT CASE 1+1 WHEN 2 THEN '1+1=2'
WHEN 3 THEN '1+1=3'
WHEN 4 THEN '1+1=4'
ELSE '몰라'
END
FROM DUAL;
--==>> 5+2=7
SELECT CASE 2+2 WHEN 2 THEN '2+2=2'
WHEN 3 THEN '2+2=3'
WHEN 4 THEN '2+2=4'
ELSE '몰라'
END
FROM DUAL;
--==>> 2+2=4
SELECT CASE 3+3 WHEN 2 THEN '3+3=2'
WHEN 3 THEN '3+3=3'
WHEN 4 THEN '3+3=4'
ELSE '몰라'
END
FROM DUAL;
--==>> 몰라
SELECT CASE WHEN 5+2=4 THEN '5+2=4'
WHEN 6-1=3 THEN '6-1=3'
WHEN 7+0=0 THEN '7+0=0'
ELSE '몰라'
END
FROM DUAL;
--==>> 몰라
SELECT CASE WHEN 5+2=4 THEN '5+2=4'
WHEN 6-1=3 THEN '6-1=3'
WHEN 7+0=7 THEN '7+0=7'
ELSE '몰라'
END
FROM DUAL;
--==>> 7+0=7
■ CASE WHEN THEN ELSE END 활용
SELECT CASE WHEN 5<2 THEN '5<2'
WHEN 5>2 THEN '5>2'
ELSE '5와2는 비교불가'
END "결과확인"
FROM DUAL;
--==>> 5>2
SELECT '5>2' "결과확인"
FROM DUAL;
SELECT CASE WHEN 5<2 OR 3>1 AND 2=2 THEN '윤수만세'
WHEN 5>2 OR 2=3 THEN '하성만세' -- 이것도 T이지만 앞에서 이미 T 값이 반환되었기 때문에 반환되지 않음
ELSE '민지만세'
END "결과확인"
FROM DUAL;
--==>> 윤수만세
SELECT CASE WHEN 3<1 AND 5<2 OR 3>1 AND 2=2 THEN '현욱만세'
WHEN 5<2 AND 2=3 THEN '나영만세'
ELSE '혜성만세'
END "결과확인"
FROM DUAL;
--==>> 현욱만세
SELECT CASE WHEN 3<1 AND (5<2 OR 3>1) AND 2=2 THEN '현욱만세'
WHEN 5<2 AND 2=3 THEN '나영만세'
ELSE '혜성만세'
END "결과확인"
FROM DUAL;
--==>> 혜성만세
■ CASE WHEN THEN ELSE END 문제 풀이 - 내가 푼 것
--○ TBL_SAWON 테이블을 활용하여 다음과 같은 항목을 조회할 수 있도록 쿼리문을 구성한다.
-- 『사원번호, 사원명, 주민번호, 성별, 현재나이, 입사일, 정년퇴직일, 근무일수, 남은일수, 급여, 보너스』
-- 단, 현재나이는 만나이 적용 이전 한국나이 계산법에 따라 연산을 수행한다.
-- 또한, 정년 퇴직일은 해당 직원의 나이가 한국 나이로 60세가 되는 해의
-- 그 직원의 입사 월, 일로 연산을 수행한다.
-- 그리고, 보너스는 1000일 이상 2000일 미만 근무한 사원은 그 사원의 원래 급여 기준 30% 지급,
-- 2000일 이상 근무한 사원은 그 사원의 원래 급여 기준 50% 지급을 할 수 있도록 처리한다.
-- EX) 1001 강혜성 9710171234567 남성 27 2005-01-03 2038-01-03 xxxx xxxxx 3000
-- 내가 풀었다~!
SELECT SANO"사원번호", SANAME"사원명", JUBUN"주민번호"
, CASE WHEN SUBSTR(JUBUN, 7, 1) IN ('1', '3') THEN '남성'
WHEN SUBSTR(JUBUN, 7, 1) IN ('2', '4') THEN '여성'
ELSE '성별 판별 불가'
END "성별"
, EXTRACT(YEAR FROM SYSDATE) - CASE WHEN SUBSTR(JUBUN, 7, 1) IN ('1','2') THEN TO_NUMBER(SUBSTR(JUBUN,1,2)) + 1899
WHEN SUBSTR(JUBUN, 7, 1) IN ('3','4') THEN TO_NUMBER(SUBSTR(JUBUN,1,2)) + 1999
ELSE -1
END "현재나이"
, HIREDATE "입사일"
, TO_CHAR(CASE WHEN SUBSTR(JUBUN,7,1) IN ('1','2') THEN TO_NUMBER(SUBSTR(JUBUN,1,2)) + 1899
WHEN SUBSTR(JUBUN,7,1) IN ('3','4') THEN TO_NUMBER(SUBSTR(JUBUN,1,2)) + 1999
ELSE -1
END + 59) || SUBSTR(HIREDATE, 5) "정년퇴직일"
, TRUNC(SYSDATE - TO_DATE(HIREDATE, 'YYYY-MM-DD'))"근무일수"
, TRUNC(TO_DATE(TO_CHAR(CASE WHEN SUBSTR(JUBUN,7,1) IN ('1','2') THEN TO_NUMBER(SUBSTR(JUBUN,1,2)) + 1899
WHEN SUBSTR(JUBUN,7,1) IN ('3','4') THEN TO_NUMBER(SUBSTR(JUBUN,1,2)) + 1999
ELSE -1
END + 60) || SUBSTR(HIREDATE, 5), 'YYYY-MM-DD') - SYSDATE) "남은일수"
, SAL "급여"
, CASE WHEN TRUNC(SYSDATE - TO_DATE(HIREDATE, 'YYYY-MM-DD')) >= 2000 THEN SAL*0.5
WHEN TRUNC(SYSDATE - TO_DATE(HIREDATE, 'YYYY-MM-DD')) >= 1000 THEN SAL*0.3
ELSE 0
END "보너스"
FROM TBL_SAWON;
■ CASE WHEN THEN ELSE END 문제 풀이 - 같이 (서브쿼리, 인라인뷰)
- 서브쿼리 : SELECT 안에 SELECT 문이 또 있다!
- INLINE VIEW : FROM 절 안에서 서브쿼리가 사용되는 경우, 해당 서브쿼리가 인라인 뷰!
- 이걸 쓰면 식을 길게 쓰지 않고 별칭을 가져와서 쿼리문을 구성할 수 있다. 변수랑 비스무리한 느낌~?
-- 같이 풀어봅시다요~!
-- 사원번호, 사원명, 주민번호, 성별, 현재나이, 입사일, 정년퇴직일, 근무일수, 급여, 보너스
-- 사원번호, 사원명, 주민번호, 성별, 현재나이, 입사일, 급여 먼저 처리
SELECT SANO "사원명", SANAME "사원명", JUBUN "주민번호"
-- 성별
, CASE WHEN SUBSTR(JUBUN, 7, 1) IN ('1', '3') THEN '남성'
WHEN SUBSTR(JUBUN, 7, 1) IN ('2', '4') THEN '여성'
ELSE '성별 확인 불가'
END "성별"
-- 현재나이 = 현재년도 - 태어난년도 + 1 (1900년대 / 2000년대)
, CASE WHEN SUBSTR(JUBUN, 7, 1) IN ('1', '2')
THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN, 1, 2)) + 1899)
WHEN SUBSTR(JUBUN, 7, 1) IN ('3', '4')
THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN, 1, 2)) + 1999)
--ELSE '나이확인불가'
ELSE -1
END "현재나이"
-- 입사일
, HIREDATE "입사일"
, SAL "급여"
FROM TBL_SAWON;
--==>> 1차적으로 처리한 내용들
/*
1001 강혜성 9710171234567 남성 27 2005-01-03 3000
1002 박가영 9511182234567 여성 29 1999-11-23 4000
1003 박나영 9902082234567 여성 25 2006-08-10 4000
1004 최혜인 9708112234567 여성 27 2010-05-06 5000
1005 아이유 0502034234567 여성 19 2015-10-19 1000
1006 이하이 0609304234567 여성 18 2012-06-17 1000
1007 인순이 6510102234567 여성 59 1999-08-22 2000
1008 선동열 6909101234567 남성 55 1998-01-10 2000
1009 이이경 0505053234567 남성 19 2011-05-06 1500
1010 선우용녀 6611112234567 여성 58 2000-01-16 1300
1011 이윤수 9501061234567 남성 29 2009-09-19 4000
1012 선우선 0606064234567 여성 18 2011-11-11 2000
1013 남진 6511111234567 남성 59 1999-11-11 2000
1014 이주형 9904171234567 남성 25 2009-11-11 2000
1015 남궁민 0202023234567 남성 22 2010-10-10 2300
*/
SELECT EMPNO, ENAME, SAL, COMM, SAL*12+NVL(COMM, 0) "연봉", 연봉*2 "연봉두배"
FROM EMP;
--==>> 에러 발생
-- (ORA-00904: "연봉": invalid identifier)
-- 파싱 순서에 의해 SELECT 문에서 부여한 별칭을 가지고 SELECT 문에서 연산하는 거 불가!
SELECT 사원번호, 사원명, 급여, 수당, 연봉, 연봉*2 "연봉두배"
FROM
(
SELECT EMPNO "사원번호", ENAME "사원명", SAL "급여", COMM "수당", SAL*12+NVL(COMM,0) "연봉"
FROM EMP
);
-->> 인라인 뷰(서브쿼리의 일종)
-- 조회한 테이블을 다시 FROM 에 넣어서
-- 조회한 테이블 내에서 데이터를 뽑겠다! 라고 하면 별칭으로 SELECT 문 작성해도 오류 발생하지 않고 데이터 추출 가능!
--○ 뷰 생성
CREATE VIEW VIEW_EMP
AS
SELECT EMPNO "사원번호", ENAME "사원명", SAL "급여", COMM "수당", SAL*12+NVL(COMM,0) "연봉"
FROM EMP;
--==>> 에러 발생
-- (ORA-01031: insufficient privileges)
--○ SYS로 접속하여 SCOTT 계정에 CREATE VIEW 권한을 부여한 후 다시 실행
CREATE VIEW VIEW_EMP
AS
SELECT EMPNO "사원번호", ENAME "사원명", SAL "급여", COMM "수당", SAL*12+NVL(COMM,0) "연봉"
FROM EMP;
--==>> View VIEW_EMP이(가) 생성되었습니다.
SELECT *
FROM VIEW_EMP;
CREATE OR REPLACE VIEW VIEW_EMP -- OR REPLACE : 만약 VIEW_EMP라는 이름을 가진 VIEW가 존재한다면 덮어쓰기 해줘~! VIEW에서만 사용할 수 있는 구문!!
AS
SELECT EMPNO "사원번호", ENAME "사원명", SAL "급여", COMM "수당", SAL*12+NVL(COMM,0) "연봉"
FROM EMP;
--==>> View VIEW_EMP이(가) 생성되었습니다.
SELECT *
FROM VIEW_EMP;
SELECT 사원번호, 사원명, 연봉
FROM VIEW_EMP;
-- 사원번호, 사원명, 주민번호, 성별, 현재나이, 입사일, 정년퇴직일, 근무일수, 급여, 보너스
-- 주석 제거한 최종 코드
SELECT T.사원번호, T.사원명, T.주민번호, T.성별, T.현재나이, T.입사일
, TO_CHAR(ADD_MONTHS(SYSDATE, (60-T.현재나이) * 12), 'YYYY')
|| '-' || TO_CHAR(T.입사일, 'MM-DD') "정년퇴직일"
, TRUNC(SYSDATE - T.입사일) "근무일수"
, TRUNC(TO_DATE(TO_CHAR(ADD_MONTHS(SYSDATE, (60-T.현재나이) * 12), 'YYYY')
|| '-' || TO_CHAR(T.입사일, 'MM-DD'), 'YYYY-MM-DD') - SYSDATE) "남은일수"
, T.급여
, CASE WHEN TRUNC(SYSDATE - T.입사일) >= 2000 THEN T.급여 * 0.5
WHEN TRUNC(SYSDATE - T.입사일) >= 1000 THEN T.급여 * 0.3
ELSE 0
END "보너스"
FROM
(
SELECT SANO "사원번호", SANAME "사원명", JUBUN "주민번호"
, CASE WHEN SUBSTR(JUBUN, 7, 1) IN ('1', '3') THEN '남성'
WHEN SUBSTR(JUBUN, 7, 1) IN ('2', '4') THEN '여성'
ELSE '성별 확인 불가'
END "성별"
, CASE WHEN SUBSTR(JUBUN, 7, 1) IN ('1', '2')
THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN, 1, 2)) + 1899)
WHEN SUBSTR(JUBUN, 7, 1) IN ('3', '4')
THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN, 1, 2)) + 1999)
ELSE -1
END "현재나이"
, HIREDATE "입사일"
, SAL "급여"
FROM TBL_SAWON
) T; -- FROM 내에 있는 내용을 T라는 테이블로 보겠다
--==>>
/*
1001 강혜성 9710171234567 남성 27 2005-01-03 2056-01-03 6867 11759 3000 1500
1002 박가영 9511182234567 여성 29 1999-11-23 2054-11-23 8735 11353 4000 2000
1003 박나영 9902082234567 여성 25 2006-08-10 2058-08-10 6283 12709 4000 2000
1004 최혜인 9708112234567 여성 27 2010-05-06 2056-05-06 4918 11883 5000 2500
1005 아이유 0502034234567 여성 19 2015-10-19 2064-10-19 2926 14971 1000 500
1006 이하이 0609304234567 여성 18 2012-06-17 2065-06-17 4145 15212 1000 500
1007 인순이 6510102234567 여성 59 1999-08-22 2024-08-22 8828 303 2000 1000
1008 선동열 6909101234567 남성 55 1998-01-10 2028-01-10 9417 1539 2000 1000
1009 이이경 0505053234567 남성 19 2011-05-06 2064-05-06 4553 14805 1500 750
1010 선우용녀 6611112234567 여성 58 2000-01-16 2025-01-16 8681 450 1300 650
1011 이윤수 9501061234567 남성 29 2009-09-19 2054-09-19 5147 11288 4000 2000
1012 선우선 0606064234567 여성 18 2011-11-11 2065-11-11 4364 15359 2000 1000
1013 남진 6511111234567 남성 59 1999-11-11 2024-11-11 8747 384 2000 1000
1014 이주형 9904171234567 남성 25 2009-11-11 2058-11-11 5094 12802 2000 1000
1015 남궁민 0202023234567 남성 22 2010-10-10 2061-10-10 4761 13866 2300 1150
*/
■ 뷰(VIEW) 생성
- 생성 쉬움, 덮어쓰기 가능
-- 위에서 처리한 내용을 기반으로
-- 특정 근무일수의 사원을 확인해야 한다거나
-- 특정 보너스 금액을 받는 사원을 확인해야 할 경우가 발생할 수 있다.
-- (즉, 추가적인 조회 조건이 발생하거나, 업무가 파생되는 경우)
-- 이와 같은 경우는 해당 쿼리문을 다시 구성해야 하는 번거로움을 줄일 수 있도록
-- 뷰(VIEW)를 만들어 저장해 둘 수 있다.
CREATE OR REPLACE VIEW VIEW_SAWON
AS
SELECT T.사원번호, T.사원명, T.주민번호, T.성별, T.현재나이, T.입사일
, TO_CHAR(ADD_MONTHS(SYSDATE, (60-T.현재나이) * 12), 'YYYY')
|| '-' || TO_CHAR(T.입사일, 'MM-DD') "정년퇴직일"
, TRUNC(SYSDATE - T.입사일) "근무일수"
, TRUNC(TO_DATE(TO_CHAR(ADD_MONTHS(SYSDATE, (60-T.현재나이) * 12), 'YYYY')
|| '-' || TO_CHAR(T.입사일, 'MM-DD'), 'YYYY-MM-DD') - SYSDATE) "남은일수"
, T.급여
, CASE WHEN TRUNC(SYSDATE - T.입사일) >= 2000 THEN T.급여 * 0.5
WHEN TRUNC(SYSDATE - T.입사일) >= 1000 THEN T.급여 * 0.3
ELSE 0
END "보너스"
FROM
(
SELECT SANO "사원번호", SANAME "사원명", JUBUN "주민번호"
, CASE WHEN SUBSTR(JUBUN, 7, 1) IN ('1', '3') THEN '남성'
WHEN SUBSTR(JUBUN, 7, 1) IN ('2', '4') THEN '여성'
ELSE '성별 확인 불가'
END "성별"
, CASE WHEN SUBSTR(JUBUN, 7, 1) IN ('1', '2')
THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN, 1, 2)) + 1899)
WHEN SUBSTR(JUBUN, 7, 1) IN ('3', '4')
THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN, 1, 2)) + 1999)
ELSE -1
END "현재나이"
, HIREDATE "입사일"
, SAL "급여"
FROM TBL_SAWON
) T;
--==>> View VIEW_SAWON이(가) 생성되었습니다.
SELECT *
FROM VIEW_SAWON;
--==>>
/*
1001 강혜성 9710171234567 남성 27 2005-01-03 2056-01-03 6867 11759 3000 1500
1002 박가영 9511182234567 여성 29 1999-11-23 2054-11-23 8735 11353 4000 2000
1003 박나영 9902082234567 여성 25 2006-08-10 2058-08-10 6283 12709 4000 2000
1004 최혜인 9708112234567 여성 27 2010-05-06 2056-05-06 4918 11883 5000 2500
1005 아이유 0502034234567 여성 19 2015-10-19 2064-10-19 2926 14971 1000 500
1006 이하이 0609304234567 여성 18 2012-06-17 2065-06-17 4145 15212 1000 500
1007 인순이 6510102234567 여성 59 1999-08-22 2024-08-22 8828 303 2000 1000
1008 선동열 6909101234567 남성 55 1998-01-10 2028-01-10 9417 1539 2000 1000
1009 이이경 0505053234567 남성 19 2011-05-06 2064-05-06 4553 14805 1500 750
1010 선우용녀 6611112234567 여성 58 2000-01-16 2025-01-16 8681 450 1300 650
1011 이윤수 9501061234567 남성 29 2009-09-19 2054-09-19 5147 11288 4000 2000
1012 선우선 0606064234567 여성 18 2011-11-11 2065-11-11 4364 15359 2000 1000
1013 남진 6511111234567 남성 59 1999-11-11 2024-11-11 8747 384 2000 1000
1014 이주형 9904171234567 남성 25 2009-11-11 2058-11-11 5094 12802 2000 1000
1015 남궁민 0202023234567 남성 22 2010-10-10 2061-10-10 4761 13866 2300 1150
*/
SELECT *
FROM VIEW_SAWON
WHERE 근무일수 >= 5000;
--==>>
/*
1001 강혜성 9710171234567 남성 27 2005-01-03 2056-01-03 6867 11759 3000 1500
1002 박가영 9511182234567 여성 29 1999-11-23 2054-11-23 8735 11353 4000 2000
1003 박나영 9902082234567 여성 25 2006-08-10 2058-08-10 6283 12709 4000 2000
1007 인순이 6510102234567 여성 59 1999-08-22 2024-08-22 8828 303 2000 1000
1008 선동열 6909101234567 남성 55 1998-01-10 2028-01-10 9417 1539 2000 1000
1010 선우용녀 6611112234567 여성 58 2000-01-16 2025-01-16 8681 450 1300 650
1011 이윤수 9501061234567 남성 29 2009-09-19 2054-09-19 5147 11288 4000 2000
1013 남진 6511111234567 남성 59 1999-11-11 2024-11-11 8747 384 2000 1000
1014 이주형 9904171234567 남성 25 2009-11-11 2058-11-11 5094 12802 2000 1000
*/
SELECT *
FROM VIEW_SAWON
WHERE 보너스 >= 2000;
--==>>
/*
1002 박가영 9511182234567 여성 29 1999-11-23 2054-11-23 8735 11353 4000 2000
1003 박나영 9902082234567 여성 25 2006-08-10 2058-08-10 6283 12709 4000 2000
1004 최혜인 9708112234567 여성 27 2010-05-06 2056-05-06 4918 11883 5000 2500
1011 이윤수 9501061234567 남성 29 2009-09-19 2054-09-19 5147 11288 4000 2000
*/
■ 서브쿼리 활용 문제 풀이
--○ 서브쿼리를 활용하여
-- TBL_SAWON 테이블을 대상으로 다음과 같이 조회할 수 있도록 한다.
/*
----------------------------------------------
사원명 성별 현재나이 급여 나이보너스
----------------------------------------------
*/
-- VIEW_SAWON 을 이용하는 것이 아님.
-- 나이보너스는 현재 나이가 40세 이상이면 급여의 70%
-- 30세 이상 40세 미만이면 급여의 50%
-- 20세 이상 30세 미만이면 급여의 30%로 한다.
-- 또한, 이렇게 완성된 조회 구문을 통해
-- VIEW_SAWON2 라는 이름의 뷰(VIEW)를 생성할 수 있도록 한다.
-- 내가 혼자 한 풀이!!
SELECT T.사원명, T.성별, T.현재나이, T.급여
, CASE WHEN T.현재나이 >= 40 THEN T.급여 * 0.7
WHEN T.현재나이 >= 30 THEN T.급여 * 0.5
WHEN T.현재나이 >= 20 THEN T.급여 * 0.3
ELSE 0
END "나이보너스"
FROM
(
SELECT SANAME "사원명"
, CASE WHEN SUBSTR(JUBUN,7,1) IN ('1', '3') THEN '남성'
WHEN SUBSTR(JUBUN,7,1) IN ('2', '4') THEN '여성'
ELSE '성별 판별 불가'
END "성별"
-- 현재나이 = 현재 날짜 - 태어난 날짜 + 1
, CASE WHEN SUBSTR(JUBUN,7,1) IN ('1', '2')
THEN (EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN,1,2)) + 1899))
WHEN SUBSTR(JUBUN,7,1) IN ('3', '4')
THEN (EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN,1,2)) + 1999))
ELSE -1
END "현재나이"
, SAL "급여"
FROM TBL_SAWON
)T;
--==>>
/*
강혜성 남성 27 3000 900
박가영 여성 29 4000 1200
박나영 여성 25 4000 1200
최혜인 여성 27 5000 1500
아이유 여성 19 1000 0
이하이 여성 18 1000 0
인순이 여성 59 2000 0
선동열 남성 55 2000 0
이이경 남성 19 1500 0
선우용녀 여성 58 1300 0
이윤수 남성 29 4000 1200
선우선 여성 18 2000 0
남진 남성 59 2000 0
이주형 남성 25 2000 600
남궁민 남성 22 2300 690
*/
CREATE OR REPLACE VIEW VIEW_SAWON2
AS
SELECT T.사원명, T.성별, T.현재나이, T.급여
, CASE WHEN T.현재나이 >= 40 THEN T.급여 * 0.7
WHEN T.현재나이 >= 30 THEN T.급여 * 0.5
WHEN T.현재나이 >= 20 THEN T.급여 * 0.3
ELSE 0
END "나이보너스"
FROM
(
SELECT SANAME "사원명"
, CASE WHEN SUBSTR(JUBUN,7,1) IN ('1', '3') THEN '남성'
WHEN SUBSTR(JUBUN,7,1) IN ('2', '4') THEN '여성'
ELSE '성별 판별 불가'
END "성별"
-- 현재나이 = 현재 날짜 - 태어난 날짜 + 1
, CASE WHEN SUBSTR(JUBUN,7,1) IN ('1', '2')
THEN (EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN,1,2)) + 1899))
WHEN SUBSTR(JUBUN,7,1) IN ('3', '4')
THEN (EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN,1,2)) + 1999))
ELSE -1
END "현재나이"
, SAL "급여"
FROM TBL_SAWON
)T;
SELECT *
FROM VIEW_SAWON2;
-- 같이 한 풀이
CREATE OR REPLACE VIEW VIEW_SAWON2
AS
SELECT T.*
, CASE WHEN T.현재나이 >= 40 THEN T.급여 * 0.7
WHEN T.현재나이 >= 30 THEN T.급여 * 0.5
WHEN T.현재나이 >= 20 THEN T.급여 * 0.3
ELSE 0
END "나이보너스"
FROM
(
SELECT SANAME "사원명"
, CASE WHEN SUBSTR(JUBUN, 7, 1) IN ('1','3') THEN '남성'
WHEN SUBSTR(JUBUN, 7, 1) IN ('2','4') THEN '여성'
ELSE '성별확인불가'
END "성별"
, CASE WHEN SUBSTR(JUBUN, 7, 1) IN ('1','2')
THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN,1,2))+1899)
WHEN SUBSTR(JUBUN, 7, 1) IN ('3','4')
THEN EXTRACT(YEAR FROM SYSDATE) - (TO_NUMBER(SUBSTR(JUBUN,1,2))+1999)
ELSE -1
END "현재나이"
, SAL "급여"
FROM TBL_SAWON
)T;
--○ 생성한 뷰(VIEW_SAWON2) 조회
SELECT *
FROM VIEW_SAWON2;
--==>>
/*
강혜성 남성 27 3000 900
박가영 여성 29 4000 1200
박나영 여성 25 4000 1200
최혜인 여성 27 5000 1500
아이유 여성 19 1000 0
이하이 여성 18 1000 0
인순이 여성 59 2000 1400
선동열 남성 55 2000 1400
이이경 남성 19 1500 0
선우용녀 여성 58 1300 910
이윤수 남성 29 4000 1200
선우선 여성 18 2000 0
남진 남성 59 2000 1400
이주형 남성 25 2000 600
남궁민 남성 22 2300 690
*/
■ DECODE()
- DECODE (컬럼, 조건1, 결과1, 조건2, 결과1, 조건3, 결과3,,,,,,)
--○ DECODE()
SELECT DECODE(5-2, 1, '5-2=1', 2, '5-2=2', 3, '5-2=3', '5-2 몰라요') "확인"
FROM DUAL;
--==> 5-2=3