본문 바로가기
Database

오라클 CASE와 DECODE로 조건 처리하기

by 굿센스굿 2024. 12. 3.
반응형


데이터베이스에서 조건에 따라 데이터를 처리해야 할 때, Oracle DB에서는 CASE와 DECODE를 자주 사용합니다. 두 기능 모두 데이터를 조회하거나 변환하는 데 강력한 도구로 활용되며, 조건 기반의 복잡한 비즈니스 로직을 효과적으로 구현할 수 있습니다.

이번 글에서는 CASE와 DECODE의 기본 개념, 사용 방법, 그리고 실무에서의 활용 예시를 3가지씩 소개하겠습니다.


1. CASE와 DECODE의 기본 개념

CASE

CASE는 SQL에서 조건문을 처리하기 위한 구문으로, 가독성이 좋고 직관적입니다. 복잡한 조건문을 다룰 때 유용하며, 다양한 데이터 타입과 논리식을 지원합니다.

기본 문법

CASE
    WHEN 조건1 THEN 결과1
    WHEN 조건2 THEN 결과2
    ...
    ELSE 기본값
END
  • 조건: 비교할 논리식(예: 컬럼 = 값, 컬럼 > 값 등).
  • 결과: 조건이 참일 경우 반환되는 값.
  • 기본값: 모든 조건이 거짓일 때 반환되는 값.

DECODE

DECODE는 Oracle DB에서 제공하는 함수로, 단순한 조건 비교에 특화되어 있습니다.
IF-ELSE와 비슷한 기능을 수행하며, 가독성은 떨어지지만 속도가 빠르다는 장점이 있습니다.

기본 문법

DECODE(표현식, 비교값1, 결과1, 비교값2, 결과2, ..., 기본값)
  • 표현식: 비교할 값.
  • 비교값: 표현식과 비교할 값.
  • 결과: 조건이 참일 때 반환되는 값.
  • 기본값: 조건에 맞는 비교값이 없을 때 반환되는 값.

2. CASE와 DECODE의 차이점

특성 CASE DECODE

지원 범위 ANSI SQL 표준 지원 Oracle DB 전용
조건 표현 복잡한 조건 및 논리식 가능 단순한 값 비교만 가능
가독성 높음 낮음
데이터 타입 지원 다양한 데이터 타입 지원 동일한 데이터 타입만 허용

3. 실무 활용 예시

예시 1: 간단한 조건에 따른 분류

문제
직원의 급여를 기준으로 급여 등급을 나누고 싶습니다.

CASE 사용

SELECT EMPLOYEE_ID, SALARY,
       CASE
           WHEN SALARY >= 10000 THEN 'A'
           WHEN SALARY >= 5000 THEN 'B'
           ELSE 'C'
       END AS SALARY_GRADE
FROM EMPLOYEES;

DECODE 사용

SELECT EMPLOYEE_ID, SALARY,
       DECODE(
           SIGN(SALARY - 10000), 1, 'A',
           SIGN(SALARY - 5000), 1, 'B',
           'C'
       ) AS SALARY_GRADE
FROM EMPLOYEES;
  • CASE는 조건식을 명확하게 표현할 수 있어 직관적입니다.
  • DECODE는 단순 값 비교와 함께 SIGN 함수를 사용해 급여 등급을 나누었습니다.

예시 2: NULL 값 처리

문제
고객의 이메일 주소가 NULL일 경우 "이메일 없음"이라는 값을 표시하고 싶습니다.

CASE 사용

SELECT CUSTOMER_ID, NAME,
       CASE
           WHEN EMAIL IS NULL THEN '이메일 없음'
           ELSE EMAIL
       END AS EMAIL_STATUS
FROM CUSTOMERS;

DECODE 사용

SELECT CUSTOMER_ID, NAME,
       DECODE(EMAIL, NULL, '이메일 없음', EMAIL) AS EMAIL_STATUS
FROM CUSTOMERS;
  • CASE는 IS NULL과 같은 논리식을 그대로 사용할 수 있습니다.
  • DECODE는 NULL을 직접 비교해야 하며, 기본값 처리가 더 간단합니다.

예시 3: 다중 조건 처리

문제
부서별 보너스 정책을 설정하고 싶습니다.

  • 영업 부서는 급여의 20%를 보너스로 지급.
  • IT 부서는 급여의 15%를 보너스로 지급.
  • 기타 부서는 급여의 10%를 보너스로 지급.

CASE 사용

SELECT EMPLOYEE_ID, DEPARTMENT_ID, SALARY,
       CASE DEPARTMENT_ID
           WHEN 10 THEN SALARY * 0.2
           WHEN 20 THEN SALARY * 0.15
           ELSE SALARY * 0.1
       END AS BONUS
FROM EMPLOYEES;

DECODE 사용

SELECT EMPLOYEE_ID, DEPARTMENT_ID, SALARY,
       DECODE(DEPARTMENT_ID, 
              10, SALARY * 0.2,
              20, SALARY * 0.15,
              SALARY * 0.1) AS BONUS
FROM EMPLOYEES;
  • CASE는 WHEN 키워드를 통해 조건을 명확히 나타낼 수 있습니다.
  • DECODE는 간단한 비교를 빠르게 처리하지만, 다중 조건에서는 가독성이 떨어질 수 있습니다.

4. CASE와 DECODE 사용 시 주의점

  1. 데이터 타입 호환성
    • DECODE는 동일한 데이터 타입만 처리 가능합니다.
    • CASE는 서로 다른 데이터 타입도 처리할 수 있어 유연성이 높습니다.
  2. NULL 처리
    • DECODE에서 NULL 비교는 별도로 처리해야 합니다.
    • CASE는 IS NULL과 같은 조건식을 바로 사용할 수 있습니다.
  3. 복잡성
    • 복잡한 논리식이 필요한 경우 CASE를 사용하세요.
    • 단순 비교 작업이라면 DECODE가 더 효율적입니다.

5. 결론

CASE와 DECODE는 Oracle DB에서 조건 처리를 위한 필수 도구입니다.
CASE는 직관적이고 복잡한 조건식을 처리하는 데 적합하며, DECODE는 단순 비교를 빠르게 수행하는 데 유리합니다. 상황에 따라 적절한 도구를 선택하면 SQL 코드의 가독성과 성능을 모두 잡을 수 있습니다.

실무 팁

  • 복잡한 로직이나 데이터 타입이 다양한 경우 CASE를 우선적으로 사용하세요.
  • 성능이 중요하고 간단한 조건 비교라면 DECODE를 활용하세요.
  • 쿼리의 의도를 명확히 하기 위해, 각 조건에 대한 주석을 추가하면 협업에 도움이 됩니다.

이제 CASE와 DECODE를 활용하여 보다 효율적인 SQL 쿼리를 작성해 보세요! 😊

반응형