─━ IT ━─

[Oracle] DECODE 함수 설명 및 사용법

DKel 2021. 2. 5. 18:39
반응형

DECODE 문자열의 대소 관계 평가를 위한 greatest, least 함수.

 

문법

DECODE (expr ,search_and_result_list [,default])
return [제3 인수 (search_and_result_list 의 첫번째 result 식)의 데이터 형식

 

파라미터

expr NULL로 설정 가능한 표현식 (숫자, 문자열, 날짜, etc)
search_and_result_list 검색 및 결과 목록 [search , result]
default 검색에 일치하지 않는 경우의 결과 default NULL

 

리턴

수식 expr 과 일치하는 검색 식 search 를 가진 result 를 돌린다.
수식 expr 검색 및 결과 목록에 포함되지 않은 경우에는 default_expr 을 돌린다.

 

조건

SQL 임베디드 SQL에서 사용 가능한 PL / SQL에 포함되어 있지 않다. (Oracle 10g R2 시점)

 

내용

검색 식 및 결과 식 목록

검색 식 및 결과 식의 목록은 [ search , result ]의 형식으로 1 세트 이상하고 

126 또는 127 세트 이하의 범위에서 검색과 그 결과를 지정한다.

결과는 모든 목록에서 등호만. 비교 연산자는 선택할 수 없다.

 

수식 expr 이 search_and_result_list 의 제1 번째의 요소 search1 과 등가라면 result1 을 돌린다.

search2 와 등가라면 result2 를 돌린다.

 

이것을 검색 및 결과 목록 [ search , result ]에 있는 만큼 반복한다.

끝까지 일치하는 요소가 없는 경우에는 옵션 지정 식 default 값을 되돌린다.

 

주의

DECODE 인수는 최대 255 개까지된다. 

만약 기본값을 사용하는 경우에는 expr 과 default 요소를 255에서 뺀 253 개가 검색 및 결과 표현식 목록의 최대이다.

결과 253/2 ⇒ 126 개까지 검색과 비교하여 대체할 수 있다.

기본값을 지정하지 않으면 127 목록을 지정할 수 있다. 

그 때의 default 는 NULL이 된다.

 

select dump (DECODE (2, 1, 'ONE', 2, 2)) "STRING" from dual;
⇒ 2가 아니라 '2'를 리턴
STRING
------------------------------
Typ = 1 Len = 1 : 50

 

select DECODE (num, 1, SYSDATE 2 'TWO', 3, NULL 'UNKNOWN') from xxx;

num = 1 일 때 ⇒ SYSDATE (DATE 형태)
num = 2 일 때 ⇒ 'TWO'(DATE 형태 ... 변환 불가능 런타임 오류)
num = 3 일 때 ⇒ NULL (DATE 형태 : OK)
기본 ⇒ 'UNKNOWN'(DATE 형태 ... 변환 불가능 런타임 오류)

 

DECODE의 사용 예

문자의 코드 포인트 순서와 사전 순이 아니라 모든 목록 순서로 정렬한다.

SQL> select  size_name from size_sample
        order by  DECODE (size_name, 'XS' , 1, 'S' , 2, 'M' , 3, 'L' , 4 'XL' , 5);
 
SIZE_NAME
----------
XS
S
M
L
XL

숫자의 일부를 DECODE 함수로 표현하고 체크한다.

DECODE 함수는 NULL을 검색 search 로 사용할 수 있는 점이 독특한 점이다.

(TO_CHAR의 로마 숫자 변환은 자리 갖춘 처리가 되어 있다)

SQL> select  num, to_char (num, 'RN' )
  2    DECODE (num, 1, 'I' , 10, 'X' , 20, 'XX' 30, 'XXX' , 40, 'XL' ,
  3 NULL, '****' ,
  4                'UNDEFINED' ) Roman_Num
  5 from decode_sample1;
 
       NUM TO_CHAR (NUM, 'RN' ) ROMAN_NUM
 ---------- ------------------ ------------ ------
         1 I I
        10 X X
        20 XX XX
        21 XXI UNDEFINED
        30 XXX XXX
        40 XL XL
<NULL> <NULL> ****

 

DECODE 수치의 등가, 대소 관계를 평가하기 위해 SIGN 함수를 사용한다.

SQL> select  num, DECODE ( sign (num-10), -1, '10 미만 ' +1, '10 이상' , 0, '10' ) X,
  2               DECODE ( sign (num-20), -1, '20 미만 ' +1, '20 이상' , 0, '20' ) XX,
  3               DECODE ( sign (num-30), -1, '30 미만 ' +1, '30 이상' , 0, '30' ) XXX,
  4               DECODE ( sign (num-40), -1, '40 미만 ' +1, '40 이상' , 0, '40' ) XL
  5 from decode_sample1;
 
       NUM X XX XXX XL
---------- -------- -------- -------- --------
         1 10 미만 20 미만 30 미만 40 미만
        10 10 20 미만 30 미만 40 미만
        20 10 이상 20 30 미만 40 미만
        21 10 이상 20 이상 30 미만 40 미만
        30 10 이상 20 이상 30 미만 40
        40 10 이상 20 이상 30 이상 40
<NULL> <NULL> <NULL> <NULL> <NULL>

 

DECODE 문자열의 대소 관계의 한쪽을 평가하려면 GREATEST, LEAST를 사용한다. DECODE를 중첩하면 더 알아낼 수 있습니다.

SQL> select  str, DECODE ( greatest ( 'AAA' , str) 'AAA' , 'AAA 이하' ) AAA 등급
  2               DECODE ( greatest ( 'BBB' , str) 'BBB' , 'BBB 이하' ) BBB,
  3               DECODE ( least ( 'CCC' , str), 'CCC' , 'CCC 이상' ) CCC,
  4               DECODE ( least ( 'DDD' , str) 'DDD' , 'DDD 이상' ) DDD
  5 from decode_sample2;
 
STR AAA BBB CCC DDD
-------- -------- -------- -------- --------
AAA AAA 다음 BBB 이하 <NULL> <NULL>
AAB <NULL> BBB 이하 <NULL> <NULL>
BBB <NULL> BBB 이하 <NULL> <NULL>
CCC <NULL> <NULL> CCC 이상 <NULL>
<NULL> <NULL> <NULL> <NULL> <NULL>
DDD <NULL> <NULL> CCC 이상 DDD 이상
EEE <NULL> <NULL> CCC 이상 DDD 이상

 

결론

DECODE 함수를 이용하는건 조건 제어 할 CASE 표현식의 존재하지 않는 Oracle8 시대까지의 기술이므로 

단순 CASE 표현식, 검색 CASE 표현식이 구비되어있는 Oracle 9i 이상이면 추천 할 수 없는 방법이다.

보기에도 좋은 간단한 CASE 표현식과 검색 CASE 표현식 을 사용하는 것이 바람직하다.

반응형