IT 개발 라이프/DB

Oracle(오라클) DECODE 함수✨

10Biliion 2024. 11. 27. 17:18

Oracle DECODE 함수 알아보기

Oracle 데이터베이스에서 DECODE 함수는 SQL에서 조건에 따라 값을 반환하는 데 사용되는 매우 강력한 함수입니다. 이 함수는 IF-THEN-ELSE 논리를 SQL에서 구현하는데 유용합니다. 이번 포스트에서는 DECODE 함수의 구조와 다양한 활용 사례를 살펴보겠습니다.

 

DECODE 함수의 기본 구조

DECODE 함수는 다음과 같은 형태를 가지고 있습니다.

DECODE(expression, search1, result1, [search2, result2, ...], default)
  • expression: 비교할 값입니다.
  • search1, search2, ...: expression과 비교할 값입니다.
  • result1, result2, ...: search 값과 일치할 때 반환할 값입니다.
  • default: 어떤 search 값과도 일치하지 않을 때 반환할 기본값입니다. 생략 가능하며, 생략 시 NULL을 반환합니다.

 

기본 사용 예시

다음 예제는 숫자 값에 따라 서로 다른 문자열을 반환합니다:

SELECT DECODE(1, 1, 'One', 2, 'Two', 'Other') AS result
FROM DUAL;
결과:
One
  • 1은 첫 번째 search 값인 1과 일치하므로 result1인 'One'이 반환됩니다.

 

NULL 값 처리

DECODE 함수는 NULL 값을 특별하게 처리합니다. 다음 예제를 보겠습니다:

SELECT DECODE(NULL, NULL, 'Match', 'No Match') AS result
FROM DUAL;
결과:
RESULT
No Match

Oracle에서 NULL은 다른 NULL과 같지 않다고 간주되기 때문에 이 결과가 반환됩니다.

 

DECODE를 사용한 실용적인 예시

1. 조건에 따라 할인율 계산

고객 등급에 따라 다른 할인율을 적용하는 예제입니다:

SELECT
    customer_id,
    customer_name,
    DECODE(customer_grade,
           'A', 0.2,  -- A 등급은 20% 할인
           'B', 0.15, -- B 등급은 15% 할인
           'C', 0.1,  -- C 등급은 10% 할인
           0) AS discount_rate
FROM customers;

 

2. 상태 코드에 따른 상태명 반환

주문 상태 코드를 상태명으로 변환하는 예제입니다:

SELECT
    order_id,
    order_status,
    DECODE(order_status,
           'P', 'Pending',
           'C', 'Completed',
           'X', 'Cancelled',
           'Unknown') AS status_name
FROM orders;

 

3. CASE문과의 비교

DECODE는 IF-THEN-ELSE 로직을 간결하게 작성할 수 있지만, 복잡한 조건에는 CASE문이 더 적합할 수 있습니다. 다음은 동일한 로직을 CASE문으로 작성한 예제입니다:

SELECT
    order_id,
    order_status,
    CASE
        WHEN order_status = 'P' THEN 'Pending'
        WHEN order_status = 'C' THEN 'Completed'
        WHEN order_status = 'X' THEN 'Cancelled'
        ELSE 'Unknown'
    END AS status_name
FROM orders;

 

4. DECODE로 다중 열 비교

DECODE는 단일 표현식 비교에만 사용할 수 있습니다. 다중 열을 비교하려면 표현식을 결합해야 합니다:

SELECT
    DECODE(employee_id || department_id,
           '1001', 'HR',
           '2002', 'Finance',
           '3003', 'Engineering',
           'Unknown') AS department_name
FROM employees;

 

DECODE 사용 시 주의사항

  1. 성능 문제: 복잡한 조건이 많아질 경우 성능이 저하될 수 있습니다. CASE문이 더 나은 성능을 제공할 수 있습니다.
  2. 가독성: DECODE는 간단한 조건에 적합하지만, 복잡한 조건에는 코드 가독성이 떨어질 수 있습니다.