1. CASE 문 — SQL의 조건문
데이터베이스에 저장된 값은 대부분 코드 형태이거나 숫자 그대로인 경우가 많다.
예를 들어 다음과 같은 값이 있다고 가정해보자.
- score: 85
- status: 1
이 값 자체는 데이터로서 문제는 없지만, 사람이 바로 이해하기에는 조금 불친절하다.
이럴 때 SQL에서 조건 분기를 통해 값을 사람이 읽기 쉬운 형태로 바꾸는 도구가 CASE 문이다.
CASE 문은 SQL에서의 if 문이라고 생각하면 된다.
2. CASE 기본 문법
CASE 문은 다음과 같은 구조를 가진다.
CASE
WHEN 조건1 THEN 결과1
WHEN 조건2 THEN 결과2
ELSE 기본값
END
위 구조를 수도코드로 표현하면 다음과 같다.
| 1. 만약 조건1이 참이면 결과1 2. 그렇지 않고 조건2가 참이면 결과2 3. 그 외에는 기본값 |
조건을 위에서부터 차례대로 검사하고, 처음으로 만족하는 조건의 결과를 반환한다.
3. SELECT에서 CASE 사용하기
상황 가정
사용자 점수(score)를 기준으로 등급을 나누고 싶다고 가정해보자.
- 90점 이상: A
- 80점 이상: B
- 그 외: C
수도코드로 먼저 생각해보기
| 점수가 90 이상이면 'A' 그렇지 않고 80 이상이면 'B' 그 외에는 'C' |
실제 SQL 코드
SELECT
user_id,
score,
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
ELSE 'C'
END AS grade
FROM users;
Line by Line
- FROM users:
users 테이블에서 데이터를 가져온다. - SELECT 절 평가:
각 행에 대해 score 값을 확인한다. - CASE 평가 시작:
첫 번째 WHEN(score >= 90)을 검사한다.
참이면 'A'를 반환하고 CASE 종료. - 첫 조건이 거짓이면:
두 번째 WHEN(score >= 80)을 검사한다. - 모든 조건이 거짓이면:
ELSE의 'C'를 반환한다. - 반환된 값은 grade 컬럼으로 결과에 표시된다.
4. 상태값 변환 예제 (코드 값을 의미로 바꾸기)
상황 가정
주문 상태가 숫자로 저장되어 있다고 가정한다.
- 1: 주문완료
- 2: 배송중
- 3: 배송완료
수도코드
| 1. 상태값이 1이면 '주문완료' 2. 상태값이 2이면 '배송중' 3. 상태값이 3이면 '배송완료' 4. 그 외에는 '기타' |
실제 SQL 코드
SELECT
order_id,
status,
CASE
WHEN status = 1 THEN '주문완료'
WHEN status = 2 THEN '배송중'
WHEN status = 3 THEN '배송완료'
ELSE '기타'
END AS status_name
FROM orders;
Line by Line
- FROM users:
users 테이블에서 데이터를 가져온다. - SELECT 절 평가:
order_id, status 를 출력한다. - CASE 평가 시작:
첫 번째 status = 1을 검사한다.
참이면 '주문완료'를 반환하고 CASE 종료. - 첫 조건이 거짓이면:
두 번째 status = 2 을 검사한다.
참이면 '배송중'을 반환하고 CASE 종료. - 두번째 조건이 거짓이면:
두 번째 status = 3 을 검사한다.
참이면 '배송완료'를 반환하고 CASE 종료. - 모든 조건이 거짓이면:
ELSE의 '기타'를 반환한다. - 반환된 값은 status_name 컬럼으로 결과에 표시된다.
이 과정에서는 실제 테이블의 값은 변경되지 않는다.
CASE는 오직 조회 결과를 가공하는 역할만 한다.
오늘 학습한 내용 정리
이번 글에서는 CASE 문을 이용해 조건에 따라 데이터를 분류하는 방법을 복습했다.
- CASE는 SQL에서 조건문, 조건 분기를 담당한다
- 숫자나 코드 값을 의미 있는 값으로 바꿀 수 있다.
- CASE는 SELECT 결과를 가공할 뿐, 원본 데이터를 수정하지 않는다
'F.SQL > SQL 기초 복습' 카테고리의 다른 글
| [SQL] 복잡한 쿼리를 다루는 방법 — 서브쿼리와 CTE (0) | 2026.01.04 |
|---|---|
| [SQL] JOIN 실전 — 테이블 연결하기 (0) | 2026.01.04 |
| [SQL] 테이블 구조 이해 & JOIN 준비 운동 (0) | 2026.01.04 |
| [SQL] 데이터를 숫자로 요약하기 — 집계와 그룹화 (0) | 2026.01.03 |
| [SQL] 기본 흐름 — SELECT부터 정렬까지 (0) | 2026.01.03 |
