-- 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)
'오라클' 카테고리의 다른 글
오라클 집계함수(성능이 많이 떨어짐) (0) | 2013.05.30 |
---|---|
오라클 집합연산자 (0) | 2013.05.30 |
오라클 LIKE : 주어진 문자열이 패턴과 일치 하는지 여부 판단(성능별로) (0) | 2013.05.30 |
오라클 IN : 피연산자중 하나와 동일하면 TRUE(OR 연산) (0) | 2013.05.30 |
오라클 ORDER BY : 정렬 (0) | 2013.05.30 |