본문 바로가기

오라클

오라클 DECODE : 각각의 조건에 맞는 값에 대한 처리 결과 리턴(CASE 보다 성능 떨어짐)

-- DECODE : 각각의 조건에 맞는 값에 대한 처리 결과 리턴(CASE 보다 성능 떨어짐)

SELECT name, ssn,

    DECODE(SUBSTR(ssn, 8,1),1, '남자', 2,'여자', 3, '남자', 4,'여자')성별

    FROM insa;

    

SELECT name, ssn,

    DECODE(MOD(SUBSTR(ssn, 8,1),2), 0, '여자', 1, '남자')성별  --MOD 나머지 구한값 -- 나머지가 0이면 여자

    FROM insa;

    

SELECT name, ssn,

    DECODE(SUBSTR(ssn, 8,1),1, '남자', 2,'여자', 3, '남자', 4,'여자')성별

    FROM insa;

 

 SELECT name, ssn,   

    DECODE(SUBSTR(ssn, 8,1),1, '남자')성별  -- 만족하는 값이 없으면 null로 찍힘

    FROM insa;

    

-- insa 테이블에서 이름, 주민번호,성별, 생년월일, 나이 출력  -- 성별,생년월일(YYYY년 mm월 dd일), 나이는 ssn 이용

SELECT name,ssn,

DECODE(SUBSTR(ssn, 8,1),1, '남자', 2,'여자', 3, '남자', 4,'여자')성별,

TO_CHAR(TO_DATE(SUBSTR(ssn, 1,6),'RRMMDD'), 'YYYY"년" MM"월" DD"일" ') 생년월일,

TRUNC(MONTHS_BETWEEN(SYSDATE,TO_DATE(SUBSTR(ssn,1,6),'RRMMDD'))/12) 나이

FROM insa;



-- insa 테이블에서 회사의 정년이 만 60세이다. 만약 나이가 60을 초과하면 "정년초과"를 출력하고, 나이가 60이면 "올해정년"을 출력하며, 그렇지 않으면

앞으로 정년까지 남은 기간을 출력한다. (CASE 문을 이용하여 계산하며 생년월일 및 나이는 ssn을 이용한다.)

-- 출력 형식

이름, 생년월일(YYYY-MM-DD),정년까지 남은년수


SELECT name

   ,TO_CHAR(TO_DATE(SUBSTR(ssn, 1, 6), 'RRMMDD'), 'YYYY-MM-DD') 생년월일

   ,TRUNC(MONTHS_BETWEEN(SYSDATE,  TO_DATE(SUBSTR(ssn, 1, 6), 'RRMMDD'))/12) 나이

   ,CASE

       WHEN TRUNC(MONTHS_BETWEEN(SYSDATE,  TO_DATE(SUBSTR(ssn, 1, 6), 'RRMMDD'))/12)>55 THEN '초과정년'

       WHEN TRUNC(MONTHS_BETWEEN(SYSDATE,  TO_DATE(SUBSTR(ssn, 1, 6), 'RRMMDD'))/12)=50 THEN '올해정년'

       ELSE TO_CHAR(55-TRUNC(MONTHS_BETWEEN(SYSDATE,  TO_DATE(SUBSTR(ssn, 1, 6), 'RRMMDD'))/12), '99')

    END 남은기간

    FROM insa;

-- 주의 : CASE로 출력되는 결과가  문자또는 숫자이므로 문자로 변환하여 모두 문자로 변환해야 한다.

--TO_CHAR 에서 99는 숫자를 문자로 변환 할때 2자리로 변환한다는 뜻.


SELECT name, birth, age,

 CASE

  WHEN age>55 THEN '정년초과'

  WHEN age=55 THEN ' 올해정년'

  ELSE TO_CHAR(55-age,'99')

 END 남은기간

 FROM(

 SELECT name

 ,TO_CHAR(TO_DATE(SUBSTR(ssn,1,6),'RRMMDD'),'YYYY-MM-DD')birth

 ,TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE(SUBSTR(ssn,1,6),'RRMMDD'))/12) age

 FROM insa)