본문 바로가기
SQL/oracle

oracle SQL - 조건 표현식 (DECODE, CASE)

by jun.s.gi 2022. 12. 7.
728x90

오라클은 조건 처리를 구현하기 위해 DECODE 함수와 CASE 표현식을 제공한다.

DECOD는 오라클 전공 함수이며, CASE 표현식은 ANSI SQL이다.


DECODE 함수

프로그래밍 언어에서 사용되는 if-then-else 구문과 비슷한 기능을 한다.

구문은 다음과 같다.

DECODE(col|표현식, search1, result1,
		   search2, result2,...,
                   default);

첫 번째 인수에 해당되는 표현식을 serach 값과 비교한 후 동일하다면 result 값을 반환한다. 마지막 default는 모든 조건에 맞지 않는 데이터에 적용할 기본값을 주기 위해 사용한다.

 

다음 보기를 보면 이해하기 쉬울 것이다.

select emp_name, position, salary, 
    DECODE(position, '사원', 1.05 * salary,
    		     '대리', 1.07 * salary,
                      salary) as INCREASED_SALARY
from y_emp;

INCREASED_SALARY 열은 사원이면 급여에 1.05를 곱하여 표현하고, 대리이면 1.07을 곱하여 표현하고 그 외에는 급여만 표시한다.

 

다음과 같이 DECODE 함수를 이용해 급여등급을 반환할 수 있다.

select emp_name || position, salary ,DECODE(trunc(salary/300), 0, 'C'
                                                             , 1, 'B'
                                                             , 2, 'A'
                                                             ,'A') "급여등급"
from y_emp;


 

CASE

case표현식은 decode함수에 비해 좀 더 if-then-else 논리에 가깝다고 볼 수 있다.

구문은 다음과 같다.

CASE 표현식 WHEN 비교 표현식1 THEN 결과1
            WHEN 비교 표현식2 THEN 결과2.....
            WHEN 비교 표현식n THEN 결과n
            ELSE else_expr end

1) case로 시작해 end로 끝나야 한다

2) 만족하는 when - then 쌍이 없고 else 절이 존재하는 경우 사용자 지정값 (else_expr)반환한다.

3) case내부 아무런 절에도 없으면 NULL을 반환한다.

 

 

사원이면 5%인상, 대리면 7%, 과장이면 10% 인상된 급여를 반환한다. 그 외 직급에 대해서는 인상되지 않은 급여 지급

select emp_name, position, salary,
	case position when '사원' then 1.05 * salary
                  when '대리' then 1.07 * salary
                  when '과장' then 1.10 * salary
                  else salary end AS INCREASED_SALARY
 from y_emp;
728x90