"CASE" 문은 데이터 '자체'를 동적으로 가공하고 새로운 의미를 부여하는, 데이터에 멋진 옷을 입히는 기술이다. 마치 "IF-THEN-ELSE"처럼, 특정 조건에 따라 다른 값을 출력하게 만드는 SQL의 강력한 조건부 로직 도구다.
"상품 목록을 조회하는데, 그냥 가격만 보여주지 말고, 가격대에 따라 '고가', '중가', '저가'와 같은 알아보기 쉬운 등급을 옆에 함께 표시하고 싶다."
물론 이 작업은 데이터베이스에서 원본 데이터를 모두 가져온 뒤, 자바나 파이썬 같은 애플리케이션 코드에서 "if-else" 문으로 처리할 수도 있다. 하지만 CASE 문을 사용하면 간단한 보고서나 데이터 분석을 할 때, 쿼리 하나만으로 원하는 최종 결과물을 바로 얻을 수 있어 매우 편리하다.
단순 CASE 문 (Simple CASE Expression)
단순 "CASE" 문은 특정 하나의 컬럼이나 표현식의 값에 따라 결과를 다르게 하고 싶을 때 사용한다. 특정 값을 기준으로 "이 값이 A면 X, B면 Y, 그 외에는 Z"와 같이 명확하게 분기할 때 유용하다.
CASE 비교대상_컬럼_또는_표현식
WHEN 값1 THEN 결과1
WHEN 값2 THEN 결과2
...
ELSE 그_외의_경우_결과
END
- 비교대상_컬럼_또는_표현식: "WHEN" 절에서 비교할 대상이 되는 컬럼 또는 표현식이다.
- WHEN 값 THEN 결과: "비교대상_칼럼_또는_표현식"의 값이 "값"과 같을 경우 "결과"를 반환한다.
- ELSE 결과: 위에 명시된 "WHEN" 조건들 중 어느 것 하나도 참이 아닐 경우, "ELSE" 뒤의 결과를 반환한다. "ELSE"를 생략했는데 모든 "WHEN" 조건이 거짓이면 "NULL"이 반환된다.
- 실행 순서: 단순 "CASE" 문도 위에서 아래 순서대로 조건을 평가하며, 가장 먼저 일치하는 "WHEN" 절을 만나는 순간 그 "THEN"의 결과를 반환하고 즉시 평가를 종료한다.
단순 CASE 문 예제: 주문 상태(status)를 한글로 표시하기
select
order_id,
user_id,
product_id,
quantity,
status,
case status
when 'PENDING' then '주문 대기'
when 'COMPLETED' then '결제 완료'
when 'SHIPPED' then '배송'
when 'CANCELLED' then '주문 취소'
else '알 수 없음'
end as status_korean
from orders;

- 이 쿼리는 "orders" 테이블의 각 행마다 "status" 컬럼의 값을 확인하여 해당하는 한글 상태 값을 "status_korean"이라는 새로운 컬럼으로 반환한다.
검색 CASE 문 (Searched CASE Expression)
검색 CASE 문은 단순 CASE 문처럼 하나의 특정 값을 비교하는 대신, 각 "WHEN" 절에 독립적인 조건식을 사용하여 복잡한 논리를 구현할 때 사용한다.
CASE
WHEN 조건1 THEN 결과1
WHEN 조건2 THEN 결과2
...
ELSE 그_외의_경우_결과
END
- WHEN 조건 THEN 결과: "WHEN" 뒤의 조건이 참(true) 일 경우, "THEN" 뒤의 결과를 반환한다.
- 여기서 조건은 "price >= 100000" , "category = '도서'" 등 다양한 비교 연산자와 논리 연산자 (AND , OR, NOT)를 포함할 수 있다.
- ELSE 결과: 위에 명시된 "WHEN" 조건들 중 어느 것 하나도 참이 아닐 경우, "ELSE" 뒤의 결과를 반환한다. "ELSE"를 생략했는데 모든 "WHEN" 조건이 거짓이면 "NULL"이 반환된다.
- 실행 순서: 검색 CASE 문도 위에서 아래 순서대로 조건을 평가하며, 가장 먼저 참이 되는 "WHEN" 절을 만나는 순간 그 "THEN"의 결과를 반환하고 즉시 평가를 종료한다. 이 순서가 매우 중요하다.
검색 CASE 문 예제: 상품 가격에 따라 등급 표시하기
select
name,
price,
case
when price >= 100000 then '고가'
when price >= 30000 then '중가'
else '저가'
end as price_label
from products;

- 여기서 "AS price_label"을 사용해, CASE 문 전체가 만들어내는 결과에 "price_label"이라는 새로운 컬럼명을 붙여주었다.
- 이 쿼리는 "products" 테이블의 각 행마다 다음의 로직을 수행한다.
- 가격이 10만 원 이상인가? 맞으면 '고가'를 반환하고 CASE 문을 끝낸다.
- (1번이 아니라면) 가격이 3만 원 이상인가? 맞으면 '중가'를 반환하고 끝낸다.
- (1, 2번이 모두 아니라면) "ELSE"에 따라 '저가'를 반환한다.
검색 CASE 문 사용 시 주의사항: WHEN 절의 순서
앞서 CASE 문은 위에서 아래로 순차적으로 평가하며, 가장 먼저 참이 되는 조건을 만나는 순간 실행을 멈춘다고 강조했다. 이 점이 검색 CASE 문에서는 특히 중요하다. 만약 조건을 잘못 배치하면 예상과 다른 결과가 나올 수 있다.
select
name,
price,
case
when price >= 30000 then '중가'
when price >= 100000 then '고가'
else '저가'
end as price_label
from products;

- 프리미엄 게이밍 마우스(75000원): 75000원은 30000원 이상이므로 '중가'로 분류된다.
- 기계식 키보드(120000원): 120000원은 30000원 이상이므로 '중가'로 분류된다
- '고가'로 분류되어야 한다.
이처럼 "WHEN price >= 100000"인 상품도 "price >= 30000" 조건을 먼저 만족시켜 '중가'로 잘못 분류될 것이다. 따라서 검색 CASE 문을 사용할 때는 조건의 순서를 신중하게 고려해야 한다. 더 포괄적인(범위가 넓은) 조건보다는 더 구체적인(범위가 좁은) 조건을 먼저 배치하는 것이 일반적이다.
CASE 문과 사용 위치
CASE 문은 "SELECT" 절 외에도 "ORDER BY", "GROUP BY" , "WHERE" 절 등 다양한 SQL 구문과 함께 사용될 수 있다.
select
name,
price,
case
when price >= 100000 then '고가'
when price >= 30000 then '중가'
else '저가'
end as price_label
from products
order by
case
when price >= 100000 then 1
when price >= 30000 then 2
else 3
end asc,
price desc
;

- 보는 것처럼, "price_label" 컬럼의 '고가', '중가', '저가' 문자열 순서가 아닌, 우리가 CASE문에서 지정한 "1", "2", "3"의 숫자 순서대로 정렬된 것을 확인할 수 있다.
- 이렇게 CASE 문은 데이터의 표현뿐만 아니라 정렬, 그룹화 등 다양한 로직에 활용할 수 있다.
'데이터 베이스 > 데이터베이스 기본' 카테고리의 다른 글
| Ch05. CASE문 - 조건부 집계 (0) | 2026.06.02 |
|---|---|
| Ch05. CASE문 - 그룹핑 (0) | 2026.06.02 |
| Ch04. UNION - UNION 정렬 (0) | 2026.05.31 |
| Ch04. UNION - UNION ALL (0) | 2026.05.31 |
| Ch04. UNION - UNION (0) | 2026.05.31 |