DECODE 사용시 주의사항

 

*DECODE 함수와 CASE문

-DECODE 함수 내부에서 DECODE문을 사용하는 경우에는 성능 저하 발생

-UNION ALL를 사용할 경우 동일 테이블에 대한 인덱스 스캔이나 테이블 스캔 반복발생으로 성능 저하

-Concat('Ⅱ') 함수로 비교대상컬럼을 묶어서 DECODE 함수의 중복사용을 줄이고, CASE문으로 비교하는 방식 추천(INDEX 주의)

 

 

DECODE 사용시 주의사항

 

*펼칠 컬럼이 너무 많을때는 먼저 GROUP BY 한 후 처리하라.

select dept_no,

sum(decode(substr(wk_kt,7,2), '01', amt)) d1,

sum(decode(substr(wk_kt,7,2), '02', amt)) d2,

sum(decode(substr(wk_kt,7,2), '03', amt)) d3,

sum(decode(substr(wk_kt,7,2), '04', amt)) d2,

,,,

sum(decode(substr(wk_kt,7,2), '31', amt)) d31

​ 

 

select dept_no,

sum(decode(dd,'01', amt)) d1,

sum(decode(dd,'02', amt)) d2,

sum(decode(dd,'03', amt)) d3,

sum(decode(dd,'04', amt)) d4,

,,,                                                                   ▶①, ②, ④, ⑤는 동일하다.

sum(decode(dd,'31', amt)) d31​                      ③의 결과는 count(8) 과 동일하다.

  from(select dept_no, substr(wk_dt,7,2), dd, sum(amt) amt

         from tab1                                                 ▶①은 ②보다 불리다하(불필요한 0 연산)

         where wk_dt like '200401%'

         )                                                            ②는 ④, ⑤보다 불리

group by dept_no

                                                                      ▶④, ⑤는 동일하다.

*COUNT, SUM의 비교

sum(decode(col1,'A',1,0))

sum(decode(col1,'A',1))             □SUM은 COUNT에 비해 30~50% 불리함

count(decode(col1,'A',1,0))                          

count(decode(col1,'A',1))           □COUNT는 not null인 경우에만 처리

count(decode(col1,'A','C'))

                                                        COUNT를 사용할 수 있다면 SUM을 사용하지 마라.

 

 

 

 

DECODE 사용시 주의사항

 

*case문으로 대체 2

 

*case문으로 대체 3

 

*case문으로 대체 4

DECODE 사용시 주의사항

 

*ELSE 없는 IF를 사용하라.

     select sum(decode(col1, 1, qty, 0)),...

  →select sum(decode(col1, 1, qty)),...

 

*가능한 그룹함수내에서 nvl을 사용하지 마라

     select sum(decode(col1, 1, nvl(qty,0))),...

  →select nvl(sum(decode(col1, 1, qty)),0),...

 

*가능한 반복해서 DECODE를 사용하지 마라

 

。컬럼결합법

     select sum(decode(market, 'D',

                              decode(type, '1',

                                       decode(unit, 'A',0.2 * col,

                                                          'B',0.5 * col,...

   →select sum(decode(market || type || unit, 'D1A', 0.2,

                                                                  'D1B' 0.5,...)) * col

 

case문으로 대체 1

 

일반 함수 CASE 함수 예

 

*사용 예

-교수 테이블에서 소속 학과에 따라 보너스를 다르게 계산하여 출력하여라. 학과 번호별로 보너스는 다음과 같이 계산한다. 학과 번호가 101이면 보너스는 급여의 10%, 102이면 20%, 201이면 30%, 나머지 학과는 0%이다.

 

 

일반 함수 CASE 함수

 

*CASE 함수

-CASE 함수는 DECODE 함수의 기능을 확장한 함수

-DECODE 함수는 표현식 또는 칼럼 값이 '=' 비교를 통해 조건과 일치하는 경우에만 다른 값으로 대치할 수 있지만, CASE 함수에서는 산술 연산, 관계 연산, 논리 연산과 같은 다양한 비교가 가능

-또한 WHEN절에서 표현식을 다양하게 정의

-8.1.7에서부터 지원되었으며, 9i에서 SQL, PL/SQL에서 완벽히 지원

-DECODE함수에 비해 직관적인 문법체계와 다양한 비교 표현식 사용

 

*사용법

 CASE expression WHEN comparison exp1 THEN return exp1

                   [WHEN comparison exp2 THEN return exp2

                    WHEN comparison exp3 THEN return exp3

                    ELSE else expression]

END

 

 

 

 

일반 함수 DECODE 함수 예

 

*사용 예

-교수 테이블에서 교수의 소속 학과 번호를 학과 이름으로 변환하여 출력하여라. 학과 번호가 101이면 '컴퓨터공학과', 102이면 '멀티미디어학과', 201이면 '전자공학과', 나머지 학과 번호는 '기계공학과(default)로 변환한다.

 

 

일반 함수 DECODE 함수

 

*DECODE 함수의 개념을 도식적으로 표현한 것이다.

 

 

+ Recent posts