컴퓨터/Oracle

Oracle (5) - SELECT문에서 IF ELSE를 사용하기 DECODE

달서비 2023. 12. 23. 22:47

오라클을 사용하다 보면 case 문을 사용하는 경우가 있습니다. 지난 편에는 null을 처리하는 방법을 소개하였으나 case 문을 이용하여 if else 형식을 사용하기도 합니다. 이번에는 DECODE 함수를 소개하려고 합니다. 참고로 IF ELSE 문은 SELECT에서 사용할 수 없으며 PL/SQL에서 사용할 수 있습니다.

database - pixabay

DECODE

SELECT NAME
     , GEND
     , DECODE(GEND, 'M', '남자', 'F', '여자', '제3의 성') AS GEND_DECODE
  FROM EXAMPLE

DECODE 함수의 구조는 다음과 같습니다.

DECODE(칼럼, 조건, TRUE 조건 값, ELSE 값)

DECODE 함수는 또한 여러 개의 식을 사용할 수 있습니다. 여러 개의 식을 사용하는 경우 아래의 형식을 가집니다.

DECODE(칼럼, 조건1, TRUE 조건1 값, 조건2, TRUE 조건2 값, 조건3, TRUE 조건3 ..., ELSE 값

여기서 비교 값과 TRUE 결과값은 각 쌍으로 사용되며 여러 개 사용할 수 있습니다. 여기서 중요한 것은 함수의 마지막 매개변수는 ELSE 결과으로 사용할 수 있습니다.(인자의 갯가 짝수일때 ) 콤보박스 느낌으로 두 개의 조건을 풀 때 사용하면 좋습니다.

 

예시 테이블

GRADE NAME GEND SCORE
1 강감찬 M 30
2 홍길동 M 40
3 황진이 F  
4 장영실 M 60
5 이순신 M  
6 익명 A 80

 

사용 예시

가장 먼저 성별의 코드를 DECODE 하는 방법입니다. GEND의 값이 'M' 인경우에는 남자를 'F'인 경우에는 여자를 출력합니다. 그리고 두 개의 값이 아닌 경우 '제3의 성'을 출력합니다.

SELECT NAME
     , GEND
     , CASE GEND WHEN 'M' THEN '남자'
                 WHEN 'F' THEN '여자'
                 ELSE '제3의 성'
       END   AS GEND_DECODE
  FROM EXAMPLE
/
SELECT NAME
     , GEND
     , DECODE(GEND, 'M', '남자', 'F', '여자', '제3의 성') AS GEND_DECODE
  FROM EXAMPLE
NAME GEND GEND_DECODE
강감찬 M 남자
홍길동 M 남자
황진이 F 여자
장영실 M 남자
이순신 M 남자
익명 A 제3의 성

 

여기 DECODE에 ELSE에 해당하는 부분은 생략이 가능합니다. 생략하는 경우 null 값이 출력됩니다.

SELECT NAME
     , GEND
     , CASE GEND WHEN 'M' THEN '남자'
                 WHEN 'F' THEN '여자'
       END   AS GEND_DECODE
  FROM EXAMPLE
/
SELECT NAME
     , GEND
     , DECODE(GEND, 'M', '남자', 'F', '여자') AS GEND_DECODE
  FROM EXAMPLE

 

NAME GEND GEND_DECODE
강감찬 M 남자
홍길동 M 남자
황진이 F 여자
장영실 M 남자
이순신 M 남자
익명 A  

 

마지막으로 비교 값에 null을 넣는 경우 NVL, NVL2 함수처럼 사용할 수 있습니다.

SELECT NAME
     , CASE SCORE WHEN null THEN GRADE
                  ELSE SCORE
       END   AS NVL_DECODE
     , CASE SCORE WHEN null THEN 'N'
                  ELSE 'Y'
       END   AS NVL2_DECODE
  FROM EXAMPLE
/
SELECT NAME
     , DECODE(SCORE, null, GRADE, SCORE) AS NVL_DECODE
     , DECODE(SCORE, null, 'N', 'Y') AS NVL2_DECODE
  FROM EXAMPLE

 

NAME NVL_DECODE NVL2_DECODE
강감찬 30 Y
홍길동 40 Y
황진이 1 N
장영실 60 Y
이순신 5 N
익명 80 Y

추가로 DECODE 함수 안에 DECODE 함수를 넣을 수도 있습니다. 하지만 유지보수 및 효율이 낮아지므로 생략하겠습니다.

 

DECODE와 CASE는 같은 것인가?

여기까지 게시글을 작성하다가 문득 이런 생각이 들었습니다. DECODE와 CASE가 비슷하게 사용이 되는데, 함수에 유무를 제외한 차이가 무엇이지? 두 개의 차이점을 정리했습니다.

 

  1. 우선 위에서 말한 것과 같이 CASE STATEMENT고, DECODE 함수입니다.
  2. NULL 값과 NULL 값을 비교할 때 DECODE TRUE를, CASE FALSE를 반환합니다. 
  3. DECODE = 연산으로만 사용할 수 있지만 CASE는 WHEN 절에 다양한 비교 연산을 사용할 수 있습니다.
  4. DECODE는 SQL에서만 사용할 수 있으며, CASE는 SQL, PL/SQL둘다 사용할 수 있습니다.

DECODE 함수는 주키와 값이 있는 데이터를 적은 코드 수로 깔끔하게 표기할 수 있는 특징이 있습니다.

 

관련 게시글

https://dalseobi.tistory.com/151

 

Oracle (4) - null값을 치환하는 방법 (NVL, NVL2, COALESCE)

오라클을 사용하 다보면 null에 따른 이벤트 처리를 많이 하게 됩니다. 저는 그동안 CASE 문을 이용하여 사용하였으나 간단하게 함수로 처리하는 방법이 있어 소개하려고 합니다. 직관적으로 알

dalseobi.tistory.com