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를 사용하는 것이 좋습니다.

성능 팁

  1. 조건 순서를 신중히 정하기 — 가장 가능성이 높은 조건을 먼저 배치
  2. 중복 평가 피하기 — CASE는 순차적으로 평가되며, 한 조건이 일치하면 이후는 평가하지 않음
  3. 적절한 컬럼에 인덱스 생성 — CASE에서 컬럼 비교를 사용한다면 인덱스가 도움이 될 수 있음
  4. 계산된 컬럼 고려 — 자주 사용하는 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가 조건부 로직을 얼마나 단순하게 만들어 주는지 확인해 보세요!