티스토리 뷰

SQL

[SQL] 조건문 - DECODE, CASE~WHEN~THEN

Aaron 2018. 12. 19. 09:26
반응형

조건문 - DECODE

 

DECODE(A, B, '1', null) ::  A 가 B 일 경우 '1'을, 아닐 경우 null(생략 가능)

DECODE(A, B, '1', '2') ::  A 가 B 일 경우 '1'을, 아닐 경우 '2'

DECODE(A, B, '1', C, '2', '3') ::  A 가 B 일 경우 '1'을, A 가 C 일 경우 '2', 둘 다 아닐 경우 '3'

DECODE(A, B, DECODE(C, D, '1', null)) ::  A 가 B 일 경우, C 가 D 를 만족하면 '1', C 가 D 가 만족 안 하면 null

DECODE(A, B, DECODE(C, D, '1', '2')) ::  A 가 B 일 경우, C 가 D 를 만족하면 '1', C 가 D 를 만족 안 하면 '2'

 

 

SQL의 DECODE 함수는 프로그래밍 언어에서의 if 문과 비슷합니다.

 

if A = 1 then 'a'
   A = 2 then 'b'
   A = 3 then 'c' 

            else 'd'

 

해석해보면, 만일 A가 1 일 경우 'a' 를,

                      A가 2 일 경우 'b' 를,

                      A가 3 일 경우 'c' 를,

                      그 이외는 'd' 를 출력하라는 뜻입니다

 

이것을 DECODE 함수로 풀어보면

 

decode(A, 1, 'a',   -- 이 부분은 사실 decode(A,1,'a',null) 과 같음. null 은 생략 가능하기때문!

              2, 'b',   

              3, 'c',   

                ,'d')   

         

 

 

 

조건문 - CASE~WHEN~THEN

 

 

CASE 조건 WHEN 결과1 THEN 출력1

              [WHEN 결과2 THEN 출력2]

                                  ELSE 출력3

END "컬럼명"

 

DECODE 에 적용한 식을 CASE 함수에도 적용해보면

 

 case when A = 1 then 'a'
       when A = 2 then 'b'
       when A = 3 then 'c'
                       else 'd'
 end           

 

 

 

조건문의 비교 (DECODE, CASE~WHEN~THEN)

 

<예제>
-emp 테이블에서 부서번호가 10이면 총무부, 20이면 인사부, 30이면 재무부를 출력

방법 1) DECODE 함수 사용

* DECODE 함수는 대소비교(<, >, =) 불가능!!

select deptno, decode(deptno, 10, '총무부',

                                        20, '인사부',

                                        30, '재무부') as "부서 이름"
 from emp;

 

 

방법 2) CASE~WHEN~THEN 함수 사용

* CASE 함수는 대소비교(<, >, =) 가능!!

select deptno,

        case when deptno=10 then '총무부'
               when deptno=20 then '인사부'
                                       else '재무부'
        end as "부서이름"
  from emp;

 

방법 3) CASE~WHEN~THEN 함수의 축양형 

* 단! CASE 함수와 같은 의미지만, case 와 when 사이에 컬럼을 사용하면  대소비교(<, >, =) 불가능!!

select deptno,

        case deptno when 10 then '총무부'
                         when 20 then '인사부'
                                     else '재무부'
         end as "부서이름"
 from emp;

 

 

 

 

조건문의 이중 사용 (DECODE, CASE~WHEN~THEN)


 

다음과 같이 if 문 사용 시,

if A = 1 and B = 1 then 'a'
           and B = 2 then 'b'
   A = 3 then 'c'

                        else 'd'

 

A 가 1 이고, B 가 1 일 경우 'a',

                 B 가 2 일 경우 'b',

A 가 3이면 'c'

그 이외는 'd' 로 출력하라. 라고 해석할 수 있습니다.

 

이와 같은 식을 decde 함수에 적용하려면 decode 함수를 중복하여 사용해야 합니다.

하지만! decode 를 중복해서 사용하면 성능상 좋은 코드는 아니므로,

이러한 경우 case 함수를 사용하는 것이 좋다고 합니다!

 

그래도, 한 번 사용해보자면

decode 함수의 이중 사용

 

decode(A, 1, decode(B, 1, 'a', 'b'),
               3, 'c',
                 ,'d')

 

case 함수의 이중 사용

 

case when A = 1 and B = 1 then 'a'
       when A = 1 and B = 2 then 'b'
       when A = 3 then 'c'
                                      else 'd'
 end

 

이렇게 사용할 수 있습니다!


이중 분기 조건문을 예제에 적용해볼까요?


ex 1) PROFESSOR 테이블에서 교수 후보를 뽑는데, 101번 부서에서 정교수만이 교수 후보가 될 수 있다.
       교수 후부 여부를 출력.

 

 

ex 2) STUDENT 테이블을 사용하여 각 학생의 이름, 학번, 성별 출력

--주민번호가 숫자로 구성되었다고 해도, 실제로는 문자타입으로 설계되어있습니다.

  결국, 문자타입 그대로 추출이 되겠죠?


 

ex 3) EMP 테이블에서 SAL 기준으로 각 직원의 등급 산정(기준 아래)
   0~2000 : A
    2000 ~ : B
 * decode는 대소비교가 불가하므로, 대소비교 사용 시 case문을 사용해줍니다.

   단, case 문에서 비교를 할 시, case when 뒤에 비교문을 작성해주어야 합니다.

CASE 함수를 사용하여 결과를 출력할 수도 있지만, DECODE 함수를 사용해서도 출력할 수 있답니다.

하지만 DECODE 함수는 대소비교가 불가하므로, SIGN 함수를 이용해서 대소비교를 간접적으로 수행할 수 있답니다.

 

급여에서 -2000 을 뺄 경우, 급여가 2000 초과이면 양수가 나올 것이고,

                                    급여가 2000 이면 0 이 나올 것이고,

                                    급여가 2000 미만이면 음수가 나올 것입니다.

하지만, 원하는 결과는 2000 미만일 경우이므로,

sign 함수의 결과가 음수일 경우 'A' 등급, 0 혹은 양수일 경우 'B' 등급를 출력하도록 해주면 되겠죠?


 

sign 함수는 양수인지 음수인지를 리턴해주는 함수죠?(양수면 1, 음수면 -1, 0이면 0으로 리턴)

혹시 sign 함수를 잘 모르시다면, 아래 글을 참고해주세요!

 


 

 


참고: KIC 캠퍼스 머신러닝기반의 빅데이터분석 양성과정

 

 

 


반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday