DECODE는 오라클에서 지원하는 내장 함수입니다. 일반 어플리케이션의 IF... ELSE와 비슷한 문법구조를

가지나, 훨씬 간결하고 표현이 용이한 장점이 있습니다. 또한, 기호를 잘 활용하면 가독성도 용이해집니다.

간단하게 DECODE를 살펴보겠습니다.


DECODE(DEPRCD, 1, '영업부','기타부서')

위의 DECODE는 실제 테이블에 데이터가 1,2,3,4,5.... 이렇게 다양한 부서가 있을 경우에 우리가

조회하고 싶은 데이터는 1인 영업부만을 부서로, 나머지는 기타로 몰아서 데이터를 보고 싶다는 의미입니다.

실제, 이 DECODE문장은 SELECT/WHERE/GROUP BY/HAVING/ORDER BY등 모든 절에 다 올수 있지만,

그 사례는 다음장에서 보기로 하고 일단, 기능에 대해서만 살펴보기로 하죠. 위 문장을 글자로 풀어내면

"부서코드가 1이면 영업부로, 그외의 데이터는 기타로 몰아달라는 것입니다.

설령 부서코드가 NULL이라 하더라도 기타로 들어가게 됩니다. 이후, NULL에 대한 강좌에서

NULL값에 대한 의미를 다시한번 확인하기로 하고, 위의 경우처럼 코드를 기준으로 가지고 데이터를

표현하는 경우에 DECODE는 짧고 간결하게 그 값을 나타낼 수 있습니다. 그렇다면, 이런 경우는 어떨까요?

관리부장님의 요구사항이 들어왔습니다.

"우리 회사에서 근무하는 직원들의 월급을 3단계로 나누어서 보고 싶다네...

100만원 미만이면 하,100~200만원이면 중,200만원이상은 상 이렇게 데이터를 보여주게나"

라고 말하고 가십니다. DECODE는 EQUAL처리 밖에 할수가 없기 때문에,

개발자는 고민에 빠지게 될 것입니다. 물론 SQL을 많이 사용해본 개발자라면 SIGN이라는함수가 있다는

것을 알기 때문에 다음과 같이 그 해답을 찾게될 것입니다.

DECODE(FLOOR(SALARY/1000000),0,'하',1,'중',2,'상')

그러나, 위와 같이 DECODE문장을 사용할 경우는 중요한 데이터를 놓칠 가능성이 있습니다.

만일, 월급이 3백만원을 넘는 직원이 존재하는 경우는 어떻게 해야할까요..

물론, DECODE(FLOOR(900000/1000000),0,'하',1,'중',2,'상',3,'상') 라는 방법으로 상중하를 나누어

줄 수는 있습니다. 그러나, 4백만원을 넘는 직원이 나오면 또 붙여야 할까요? 이것은 문제가 있습니다. 그래서,

다음과 같이 SQL을 다시 개량하게 됩니다.

DECODE(SIGN(FLOOR((SALARY-1000000)/1000000)),-1,'',0,'',1,')

이제 2백만원을 넘는 직원에 대해서는 그 급여가 얼마이든 상으로 표현할 수 있게 되겠네요.

하지만 살펴봅시다. 한개의 직원 데이터 급여의 상중하를 구분해 내기 위해서, FLOOR와 SIGN,DECODE를

각각 수행해 봐야 하는 상황이 발생합니다. 더구나 빼고 더하고 산수기호 처럼 햇갈리죠...

거기다 산술연산의 우선순위(굳이 언급 하지는 않겠습니다)까지 고려해야 한다면 복잡한 쿼리일 경우

오히려 가독성이 떨어질 수 있습니다. 이러한 이유로 ANSI-92에서 제시된 새로운 표현방법이 CASE문입니다.

CASE문에서는 위와 같은 문장을 아래와 같이 해소할 수 있습니다.


CASE  WHEN SALARY < 1000000                                  THEN '하'
          WHEN SALARY >= 1000000 AND SALARY < 2000000 THEN '중'
          WHEN SALARY < 2000000                                  THEN '상'
  END

이제 복잡한 덧셈뺄샘도, 나누기와 몫을 구하는 함수도 기억할 필요가 없습니다. 다만,

CASE문장을 어떻게 쓰는지는 기억해야 합니다. 그러나, CASE문장이 DECODE문장 보다는

훨씬 그 표현해야 하는 내용이 길어졌죠? 그게 CASE문의 단점입니다.

따라서, EQUAL에 의한 데이터처리가 가능한 경우에는 DECODE가, RANGE에 의한 데이터 분류가

필요한 경우는 CASE가 유리할수 있겠습니다. 이런 방식으로 나누어서 사용하신다면 훨씬 더 효과적이겟죠?



'먹고살기 > Oracle' 카테고리의 다른 글

SQL -- Analytic Function  (0) 2011.08.10
GROUP BY의 고급 응용  (0) 2011.08.10
Oracle case문  (0) 2011.08.10
oracle case when ~ then~ else end  (0) 2011.08.10
Oracle Sql Case 사용법  (0) 2011.08.10