본문 바로가기

Oracle

Oracle DECODE, CASE, NVL/NVL2, VIEW 함수 정리 및 예제


1. DECODE 함수

DECODE는 특정 컬럼 값에 따라 여러 결과를 반환할 때 사용합니다.
구문이 짧고 간단하지만, 표현력이 제한적이므로 단순 매핑에 적합합니다.

DECODE(expr,
       search1, result1,
       search2, result2,
       …,
       default  
)
  • expr: 비교 대상 컬럼 또는 표현식
  • searchN: 찾을 값
  • resultN: 매칭 시 반환값
  • default: 모든 search 값과 불일치할 때 반환값

예제: 사원 테이블 sawon에 부서명 붙이기

SELECT sabun,
       saname,
       sapay,
       deptno,
       DECODE(deptno,
              10, '총무부',
              20, '영업부',
              30, '전산실',
              40, '관리부',
              50, '경리부',
              '부서없음') AS 부서명
  FROM sawon;
  • deptno 값이 10이면 ‘총무부’, 20이면 ‘영업부’…
  • 그 외 모든 값에는 ‘부서없음’을 출력

2. CASE 문

CASE는 DECODE보다 유연하며, 복잡한 조건이나 비교식을 지원합니다.
형식은 크게 두 가지입니다.

형식 1: 단순 CASE

CASE expr
  WHEN value1 THEN result1
  WHEN value2 THEN result2
  …
  ELSE default
END
  • expr와 각 WHEN 값(valueN)을 비교

형식 2: 검색 CASE

CASE
  WHEN condition1 THEN result1
  WHEN condition2 THEN result2
  …
  ELSE default
END
  • 복잡한 조건식(conditionN)을 직접 작성

예제: 부서명 처리

SELECT sabun,
       saname,
       sajob,
       deptno,
       CASE deptno
         WHEN 10 THEN '총무부'
         WHEN 20 THEN '영업부'
         WHEN 30 THEN '전산부'
         WHEN 40 THEN '관리부'
         WHEN 50 THEN '경리부'
         ELSE '기타'
       END AS 부서명
  FROM sawon;

예제: 계절 조회 (검색 CASE)

SELECT sabun,
       saname,
       sahire,
       CASE
         WHEN TO_NUMBER(TO_CHAR(sahire, 'MM')) IN (3, 4, 5) THEN '봄'
         WHEN TO_NUMBER(TO_CHAR(sahire, 'MM')) IN (6, 7, 8) THEN '여름'
         WHEN TO_NUMBER(TO_CHAR(sahire, 'MM')) BETWEEN 9 AND 11 THEN '가을'
         ELSE '겨울'
       END AS season
  FROM sawon;

3. NULL 처리: NVL, NVL2

NULL 값을 다른 값으로 대체할 때 사용합니다.

  • NVL(expr, replace_value)
    • expr이 NULL이면 replace_value를 반환
  • NVL2(expr, value_if_not_null, value_if_null)
    • expr이 NULL이 아니면 value_if_not_null, NULL이면 value_if_null 반환
SELECT sabun,
       saname,
       samgr,
       NVL(samgr, 0)  AS mgr_no_zero,  -- NULL → 0
       NVL2(samgr, 1, 0) AS has_mgr    -- mgr 존재 여부(1/0)
  FROM sawon;

4. VIEW를 활용한 복잡한 계산 예제

사원 또는 고객 정보를 기반으로 나이, 성별, 계절, 십이지, 간지(干支) 등을 조회하는 예제입니다.
뷰(View)로 미리 가공해두면 재사용이 편리합니다.

단계 1: 고객 정보 가공 뷰

CREATE OR REPLACE VIEW customer_info AS
SELECT gobun,
       goname,
       goaddr,
       gojumin,
       godam,
       CASE
         WHEN MOD(TO_NUMBER(SUBSTR(gojumin, 8, 1)), 2) = 0 THEN '여자'
         ELSE '남자'
       END AS gogender,
       CASE
         WHEN TO_NUMBER(SUBSTR(gojumin, 3, 2)) IN (3, 4, 5) THEN '봄'
         WHEN TO_NUMBER(SUBSTR(gojumin, 3, 2)) IN (6, 7, 8) THEN '여름'
         WHEN TO_NUMBER(SUBSTR(gojumin, 3, 2)) IN (9, 10, 11) THEN '가을'
         ELSE '겨울'
       END AS goseason,
       (TO_NUMBER(SUBSTR(gojumin, 1, 2)) +
        CASE
          WHEN SUBSTR(gojumin, 8, 1) IN ('3','4','7','8') THEN 2000
          WHEN SUBSTR(gojumin, 8, 1) IN ('1','2','5','6') THEN 1900
          ELSE 1800
        END) AS goborn
  FROM gogek;

단계 2: VIEW를 조회해 나이·십이지·간지 출력

SELECT g.*,
       TO_NUMBER(TO_CHAR(SYSDATE, 'YYYY')) - goborn AS age,
       CASE MOD(goborn, 12)
         WHEN 1  THEN '닭'
         WHEN 2  THEN '개'
         WHEN 3  THEN '돼지'
         WHEN 4  THEN '쥐'
         WHEN 5  THEN '소'
         WHEN 6  THEN '호랑이'
         WHEN 7  THEN '토끼'
         WHEN 8  THEN '용'
         WHEN 9  THEN '뱀'
         WHEN 10 THEN '말'
         WHEN 11 THEN '양'
         ELSE '원숭이'
       END AS zodiac,
       (SUBSTR('경신임계갑을병정무기', MOD(goborn,10) + 1, 1) ||
        SUBSTR('신유술해자축인묘진사오미', MOD(goborn,12) + 1, 1)
       ) AS ganji
  FROM customer_info g;

5. 주요 함수 비교

함수 용도 장점 단점
DECODE 간단한 값 매핑 짧은 문법, 빠른 작성 가능 복잡한 조건 처리 불가
CASE 복잡한 조건·비교식 처리 다양한 조건 표현 가능 긴 코드
NVL NULL → 대체값 단일 값 대체에 직관적 표현식 결과 NULL 여부만 처리
NVL2 NULL 여부에 따른 분기 처리 NULL/NOT NULL을 동시에 처리 가능 가독성 저하 가능