[Oracle] 오라클 DECODE 함수 사용법

DECODE 함수

DECODE 함수는 오라클에서 지원하는 편리한 함수이다.

다른 프로그래밍 언어에서 사용되는 if~else문의 기능을 편리하게 수행할 수 있다.

 

DECODE("컬럼", "조건1", "결과1", "조건2", "결과2"...."else결과")

 

기본적인 사용법은 위와 같다. 만약 컬럼의 조건1이 만족되면 결과1이 출력되고 조건2가 만족되면 결과2가 출력.... 식으로 조건-결과가 한 쌍을 이루며 if문처럼 동작한다.

 

만약 모든 조건이 만족되지 않는다면 마지막 "else결과"가 출력된다. 

"else결과"는 생략할 수 있다. 

 

예를 들어 아래와 같은 경우를 보자.

 

WITH TB_TEL AS (
    SELECT '02' REGION_TEL FROM DUAL UNION ALL
    SELECT '031' REGION_TEL FROM DUAL UNION ALL
    SELECT '032' REGION_TEL FROM DUAL UNION ALL
    SELECT '000' REGION_TEL FROM DUAL
)

SELECT REGION_TEL
     , DECODE(REGION_TEL, '02', '서울', '031', '경기도', '032', '인천', '그 외') AS REGION
FROM TB_TEL

 

결과 : 

REGION_TEL REGION
02 서울
031 경기도
032 인천
000 그 외

 

 

CASE문과 비교

DECODE 함수는 CASE문과 다르게 오직 오라클에서만 지원한다. 따라서 MySQL 등과는 호환될 수 없기 때문에 만약 데이터베이스 시스템을 바꿔야 한다면 모든 DECODE문을 바꿔야 하는 불상사가 발생할 수 있다.

 

CASE문은 부등호(>, <) 연산이 가능하지만 DECODE문은 오직 등호(=) 연산만 가능하다. 

'A=B라면 C를 출력'과 같이 오직 등호 연산만 가능하기 때문에 부등호 연산이 필요한 경우 CASE문을 사용해야 한다.

 

 

DECODE문의 중첩

DECODE문은 DECODE문에 중첩이 가능하다.

 

DECODE(A, B, DECODE(A2, C, X, Y), Z)

 

위와 같은 DECODE 문이 있다고 하자. 

이건 아래와 같이 해석할 수 있다.

 

  • A=B일 때 A2=C 라면 X 출력
  • A=B일 때 A2 != C라면 Y 출력
  • A!=B 라면 Z 출력

 

 

DECODE문은 자제해야한다?

DECODE 문은 가독성이 좋지 않다. 사용하기에 매우 편리하지만 만약 조건이 많아지거나 DECODE 내부에 DECODE 함수를 중첩하는 등으로 사용한다면 가독성을 매우 해칠 수 있다.

 

또한 표준 SQL이 아니기 때문에 이식성도 매우 떨어진다. 

 

따라서 DECODE문을 남발하기보다는 ANSI 표준인 CASE~WHEN 문의 사용과 비교하여 어떤 방식이 적절할지 고민해봐야 한다.

반응형

댓글

Designed by JB FACTORY