📚 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