SQL CASE 구문: 쿼리에 조건부 로직 추가하기
Published: 2026-02-11
CASE 구문은 SQL에서 쿼리에 조건부 로직을 추가하는 방법입니다. if-then-else 문처럼 동작하여 조건에 따라 서로 다른 값을 반환할 수 있습니다. CASE는 SQLite, PostgreSQL, MySQL, SQL Server, Oracle 등 주요 SQL 데이터베이스에서 모두 지원됩니다.
샘플 데이터
모든 예제에서 두 개의 테이블을 사용합니다:
products 테이블:
| id | name | category | price | stock | rating |
|---|---|---|---|---|---|
| 1 | Laptop Pro | Electronics | 1299.99 | 15 | 4.5 |
| 2 | Wireless Mouse | Electronics | 29.99 | 50 | 4.2 |
| 3 | Office Chair | Furniture | 249.99 | 8 | 4.7 |
| 4 | Desk Lamp | Furniture | 39.99 | 25 | 3.9 |
| 5 | Notebook Pack | Stationery | 12.99 | 100 | 4.0 |
| 6 | Pen Set | Stationery | 8.99 | 75 | 3.5 |
| 7 | Monitor 27" | Electronics | 399.99 | 0 | 4.6 |
| 8 | Standing Desk | Furniture | 599.99 | 3 | 4.8 |
orders 테이블:
| id | product_id | quantity | order_date | status |
|---|---|---|---|---|
| 1 | 1 | 2 | 2026-02-01 | delivered |
| 2 | 2 | 5 | 2026-02-03 | shipped |
| 3 | 3 | 1 | 2026-02-05 | processing |
| 4 | 4 | 3 | 2026-02-06 | delivered |
| 5 | 5 | 10 | 2026-02-07 | shipped |
| 6 | 1 | 1 | 2026-02-08 | cancelled |
| 7 | 7 | 1 | 2026-02-09 | pending |
| 8 | 8 | 1 | 2026-02-10 | processing |
단순 CASE 표현식
단순 CASE 표현식은 컬럼이나 표현식을 특정 값들과 비교합니다. 동등성만 검사할 때 간결합니다.
문법
CASE column_name
WHEN value1 THEN result1
WHEN value2 THEN result2
ELSE default_result
END
예시: 주문 상태 분류하기
주문 상태 코드를 사용자 친화적인 라벨로 변환합니다:
검색 CASE 표현식
검색 CASE 표현식은 불리언 조건을 평가하여, 복잡한 비교나 범위 조건을 사용할 수 있습니다.
문법
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE default_result
END
예시: 가격대 분류
제품을 가격 범위별로 분류합니다:
예시: 재고 상태
서로 다른 기준으로 재고 상태를 결정합니다:
계산식에서 CASE 사용하기
CASE 구문은 계산을 수정하거나, 조건부 공식을 적용하거나, NULL 값을 처리하는 데 사용할 수 있습니다.
예시: 카테고리별 할인 적용
제품 카테고리에 따라 할인을 계산합니다:
예시: 금액과 상태로 주문 우선순위 정하기
여러 요소를 기반으로 주문 우선순위를 계산합니다:
집계에서 CASE 사용하기
집계 함수 안에서 CASE를 사용해 피벗과 비슷한 보고서나 조건부 카운트를 만들 수 있습니다.
예시: 재고 상태별 제품 수 세기
각 재고 상태에 해당하는 제품 수를 셉니다:
예시: 카테고리와 상태별 매출
조건부 집계를 사용해 다양한 지표를 계산합니다:
ORDER BY에서 CASE 사용하기
ORDER BY 절에서 CASE를 사용해 사용자 정의 정렬 로직을 만들 수 있습니다.
예시: 사용자 정의 정렬 순서
제품을 사용자 정의 우선순위(품절 먼저, 그다음 평점 순)로 정렬합니다:
중첩 CASE 구문
더 복잡한 로직을 위해 CASE 표현식을 중첩해서 사용할 수 있습니다.
예시: 복합 제품 분류
여러 기준을 결합해 상세한 분류를 만듭니다:
CASE 구문의 일반적인 활용 사례
- 데이터 분류 — 값을 범위나 카테고리로 그룹화
- 조건부 포매팅 — 사용자 친화적인 라벨이나 상태 표시
- 동적 계산 — 조건에 따라 다른 공식을 적용
- 피벗 테이블 생성 — 집계와 결합해 크로스탭 보고서 만들기
- 사용자 정의 정렬 — 비즈니스 로직에 맞는 정렬 순서 정의
- NULL 값 처리 — 누락된 데이터를 대체하거나 표시
- 다중 기준 의사결정 — 복잡한 비즈니스 규칙을 SQL로 구현
CASE vs. IIF 및 COALESCE
- CASE — 가장 유연하며, 여러 조건을 처리할 수 있음
- IIF(condition, true_value, false_value) — 단일 조건에 대한 더 단순한 문법(SQL Server, Access)
- COALESCE(val1, val2, …) — 첫 번째 NULL이 아닌 값을 반환(NULL 처리에 유용)
SQLite는 CASE와 COALESCE는 지원하지만 IIF는 지원하지 않습니다. 최대 호환성을 위해 CASE를 사용하는 것이 좋습니다.
성능 팁
- 조건 순서를 신중히 정하기 — 가장 가능성이 높은 조건을 먼저 배치
- 중복 평가 피하기 — CASE는 순차적으로 평가되며, 한 조건이 일치하면 이후는 평가하지 않음
- 적절한 컬럼에 인덱스 생성 — CASE에서 컬럼 비교를 사용한다면 인덱스가 도움이 될 수 있음
- 계산된 컬럼 고려 — 자주 사용하는 CASE 로직은, 일부 DB에서 인덱스가 걸린 계산된 컬럼으로 만들 수 있음
요약
CASE는 SQL 쿼리에 if-then-else 방식의 조건부 로직을 추가한다- 단순 CASE는 컬럼을 특정 값과 비교한다:
CASE column WHEN value THEN result - 검색 CASE는 불리언 조건을 평가한다:
CASE WHEN condition THEN result - SELECT, WHERE, ORDER BY, 집계 함수 등에서 사용할 수 있다
- 복잡한 의사결정 트리를 위해 CASE 표현식을 중첩할 수 있다
- 예기치 않은 값을 처리하기 위해 항상 ELSE 절을 포함하는 것이 좋다
- 주요 SQL 데이터베이스에서 일관된 문법으로 지원된다
예제들을 수정해 보면서 다양한 조건을 실험해 보고, CASE가 조건부 로직을 얼마나 단순하게 만들어 주는지 확인해 보세요!