본문 바로가기
ORACLE

[ORACLE] oracle decode 와 case when

by 공뭉 2020. 8. 26.
반응형

오늘은 여러가지 경우에 선택할 수 있는 기능을 제공해주는
oracle 선택함수에 대해 포스팅한다.

--주민등록번호를 통해 남자는 '남', 여자는 '여'로 나타낼때 다음과 같이 사용할 수 있다.
SELECT CTM_ID, CTM_NAME, CTM_NO,
       DECODE(SUBSTR(CTM_NO, 8, 1), '1', '남', '2', '여')
FROM CUSTOMER;

--마지막 인자로 조건값을 안주고 작성하면
--아무것도 해당하지 않을 때 마지막에 작성한 선택값이 DEFAULT값이 된다.
SELECT CTM_ID, CTM_NAME, CTM_NO,
       DECODE(SUBSTR(CTM_NO, 8, 1), '1', '남', '여')
FROM CUSTOMER;

--가입한 요금제가 'P1'인 고객은 20% 할인
--'G1'인 고객은 15% 할인, 'S1'인 고객은 10% 할인, 그외 고객은 5%만 할인해주자.
SELECT  CTM_ID, CTM_NAME, CTM_NO, PAY_AMT, 
       DECODE(CTM_PLAN, 'P1', PAY_AMT * 0.8,
                                    'G1', PAY_AMT * 0.85,
                                    'S1', PAY_AMT * 0.9,
                                    PAY_AMT * 0.95) 납부금액
FROM EMPLOYEE;


위와 같은 decode는 단일값만 조건을 줄수 있다.
이런 decode의 단점을 case when이 해결해줄 수 있다.

--예를들어, 주민등록번호 뒷자리가
--'1', '3'으로 시작하면 '남',
--'2', '4'로 시작하면 '여'로 나타낼때 decode를 사용해보자.
SELECT CTM_ID, CTM_NAME, CTM_NO, 
       DECODE(SUBSTR(CTM_NO, 8, 1), '1'||'3', '남', '2'||'4', '여') 
FROM CUSTOMER;
하면 될거같지만, 안된다...
|| 말고도 or 해봐도 안되고 어떻게 해도 안된다.
(혹시 되는거 아는사람있으면 알려주시길...)
우선 안되는 이유는 ||는 select 절에서 or가 아니라
concat. 즉, 문자열 합치기 역할을 해서 안된다.

이렇게 case when 구문을 써서 해결해줘야 한다.
SELECT CTM_ID,CTM_NAME,CTM_NO,
       CASE WHEN SUBSTR(CTM_NO, 8, 1) IN ('1', '3') THEN '남'
            ELSE '여'
       END 성별
FROM CUSTOMER;


구문의 기본형은 아래와 같다.
CASE WHEN 조건식 THEN 결과값
        WHEN 조건식 THEN 결과값
        ELSE 결과값
END

반응형

댓글