
Oracle에서 데이터를 조회하다 보면 조건에 따라 다른 값을 출력해야 하는 경우가 자주 있습니다.
이럴 때 많이 사용하는 문법이 DECODE와 CASE WHEN입니다.
두 문법 모두 조건에 따라 원하는 값을 반환하는 역할을 하지만, 사용할 수 있는 조건의 범위와 문법에는 차이가 있습니다.
이번 글에서는 Oracle DECODE와 CASE WHEN의 차이점, 각각의 사용법, 그리고 실무에서는 어떤 상황에서 사용하는 것이 좋은지 예제와 함께 알아보겠습니다.
DECODE란?
DECODE는 Oracle에서 제공하는 함수로, 특정 값과 일치하는지 비교하여 원하는 결과를 반환합니다.
기본 문법은 다음과 같습니다.
DECODE(비교값,
조건1, 결과1,
조건2, 결과2,
...
기본값)
예를 들어 학생의 학점을 문자로 출력하려면 다음과 같이 사용할 수 있습니다.
SELECT
GRADE,
DECODE(
GRADE,
'A', '우수',
'B', '양호',
'C', '보통',
'D', '미흡',
'기타'
) AS GRADE_NAME
FROM STUDENT;
결과
| GRADE | GRADE_NAME |
|---|---|
| A | 우수 |
| B | 양호 |
| C | 보통 |
| D | 미흡 |
| E | 기타 |
DECODE는 값이 같은지(=) 만 비교할 수 있는 것이 특징입니다.
CASE WHEN이란?
CASE WHEN은 조건에 따라 다른 값을 반환하는 SQL 문법입니다.
기본 문법은 다음과 같습니다.
CASE
WHEN 조건 THEN 결과
WHEN 조건 THEN 결과
ELSE 기본값
END
위와 같은 예제를 CASE WHEN으로 작성하면 다음과 같습니다.
SELECT
GRADE,
CASE
WHEN GRADE = 'A' THEN '우수'
WHEN GRADE = 'B' THEN '양호'
WHEN GRADE = 'C' THEN '보통'
WHEN GRADE = 'D' THEN '미흡'
ELSE '기타'
END AS GRADE_NAME
FROM STUDENT;
결과는 DECODE와 동일합니다.
DECODE와 CASE WHEN 차이
두 문법의 가장 큰 차이는 조건을 표현하는 방식입니다.
| 구분 | DECODE | CASE WHEN |
|---|---|---|
| 비교 방식 | 값 비교(=) | 모든 조건 가능 |
| 범위 비교 | 불가능 | 가능 |
| AND, OR 사용 | 불가능 | 가능 |
| 가독성 | 보통 | 좋음 |
| ANSI SQL 표준 | ❌ | ✅ |
DECODE는 단순한 값 비교에 적합하고, CASE WHEN은 복잡한 조건까지 자유롭게 작성할 수 있습니다.
사용 예제 비교
DECODE
SELECT
DECODE(
STATUS,
'Y', '사용',
'N', '미사용',
'확인 필요'
) AS STATUS_NAME
FROM MEMBER;
STATUS 값이 ‘Y’ 또는 ‘N’인 경우 각각 다른 문자로 출력합니다.
CASE WHEN
SELECT
SCORE,
CASE
WHEN SCORE >= 90 THEN 'A'
WHEN SCORE >= 80 THEN 'B'
WHEN SCORE >= 70 THEN 'C'
ELSE 'F'
END AS GRADE
FROM STUDENT;
점수 범위에 따라 학점을 출력합니다.
이처럼 범위 조건은 CASE WHEN만 사용할 수 있습니다.
같은 데이터를 두 문법으로 비교하기
단순한 값 비교라면 DECODE와 CASE WHEN은 동일한 결과를 반환합니다.
SELECT
GRADE,
DECODE(
GRADE,
'A', '우수',
'B', '양호',
'기타'
) AS DECODE_RESULT,
CASE
WHEN GRADE = 'A' THEN '우수'
WHEN GRADE = 'B' THEN '양호'
ELSE '기타'
END AS CASE_RESULT
FROM STUDENT;
결과
| GRADE | DECODE_RESULT | CASE_RESULT |
|---|---|---|
| A | 우수 | 우수 |
| B | 양호 | 양호 |
| C | 기타 | 기타 |
위 예제처럼 단순히 하나의 값을 다른 값으로 치환하는 경우에는 두 문법의 결과가 같습니다.
하지만 범위 조건이나 여러 조건을 조합해야 한다면 CASE WHEN이 훨씬 유연합니다.
언제 DECODE를 사용할까?
다음처럼 하나의 값을 다른 값으로 변경하는 경우에는 DECODE가 간단합니다.
DECODE(GENDER,
'M', '남자',
'F', '여자',
'기타')
코드값을 사람이 읽기 쉬운 문자로 변경할 때 자주 사용됩니다.
언제 CASE WHEN을 사용할까?
다음과 같은 경우에는 CASE WHEN이 더 적합합니다.
- 점수 구간 계산
- 날짜 비교
- NULL 조건 처리
- AND, OR 조건 사용
- 여러 조건 조합
예를 들어 급여 구간을 나누려면 다음과 같이 사용할 수 있습니다.
CASE
WHEN SALARY >= 10000000 THEN '고액'
WHEN SALARY >= 5000000 THEN '중간'
ELSE '일반'
END
이처럼 범위 조건이나 복잡한 조건은 CASE WHEN을 사용하는 것이 좋습니다.
실무에서는 어떤 문법을 더 많이 사용할까?
최근에는 CASE WHEN을 사용하는 경우가 더 많습니다.
그 이유는 다음과 같습니다.
- 가독성이 좋습니다.
- 복잡한 조건을 쉽게 작성할 수 있습니다.
- ANSI SQL 표준이므로 Oracle뿐 아니라 PostgreSQL, MySQL, SQL Server 등 다양한 데이터베이스에서도 사용할 수 있습니다.
반면 DECODE는 Oracle에서만 사용할 수 있는 함수입니다.
다만 오래된 Oracle 프로젝트에서는 DECODE가 많이 사용되기 때문에 유지보수 업무를 하다 보면 여전히 자주 접하게 됩니다.
요약
Oracle의 DECODE와 CASE WHEN은 모두 조건에 따라 다른 값을 반환하는 기능을 제공합니다.
DECODE는 단순한 값 비교와 코드값 변환에 적합하며, CASE WHEN은 범위 비교와 복잡한 조건을 처리할 때 더 유용합니다.
최근에는 가독성과 확장성이 뛰어난 CASE WHEN을 사용하는 경우가 많지만, 기존 Oracle 시스템에서는 DECODE도 여전히 널리 사용되고 있습니다.
자주 묻는 질문(FAQ)
Q1. DECODE와 CASE WHEN은 같은 기능인가요?
비슷한 역할을 하지만 완전히 같지는 않습니다. DECODE는 값 비교만 가능하며, CASE WHEN은 범위 조건이나 다양한 비교식을 사용할 수 있습니다.
Q2. DECODE에서 ‘>=’ 같은 비교도 가능한가요?
아니요. DECODE는 값이 같은지만 비교할 수 있습니다. 범위 조건이 필요하다면 CASE WHEN을 사용해야 합니다.
Q3. 실무에서는 어떤 문법을 더 많이 사용하나요?
신규 개발에서는 CASE WHEN을 더 많이 사용합니다. 다만 기존 Oracle 프로젝트에서는 DECODE도 여전히 자주 사용됩니다.
Q4. CASE WHEN은 Oracle 전용 문법인가요?
아니요. CASE WHEN은 ANSI SQL 표준 문법으로 Oracle뿐 아니라 MySQL, PostgreSQL, SQL Server 등 대부분의 DBMS에서 사용할 수 있습니다.
함께 보면 좋은 Oracle 글
