반응형
IF() 함수가 간단한 조건 분기에 적합하다면, 복잡한 조건을 처리하려면 CASE WHEN 문이 훨씬 더 강력하다. CASE는 다중 조건을 순차적으로 평가하고 그에 따라 다른 결과를 반환할 수 있는 대표적인 흐름 제어 구조다.

CASE 기본 문법
CASE
WHEN 조건1 THEN 결과1
WHEN 조건2 THEN 결과2
...
ELSE 기본값
END
위에서부터 순서대로 조건을 검사하며, 가장 먼저 참이 되는 조건의 결과가 반환된다. 조건이 모두 거짓이면 ELSE절이 실행된다.
예제 1: 점수에 따른 학점 부여
SELECT name, score,
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
WHEN score >= 70 THEN 'C'
ELSE 'F'
END AS grade
FROM students;
조건을 순차적으로 평가해 가장 알맞은 학점을 부여한다. IF() 중첩보다 가독성이 훨씬 좋다.
예제 2: 회원 등급 표시
SELECT user_id, total_spent,
CASE
WHEN total_spent >= 100000 THEN 'VIP'
WHEN total_spent >= 50000 THEN 'Gold'
WHEN total_spent >= 10000 THEN 'Silver'
ELSE 'Bronze'
END AS membership
FROM users;
실제 서비스에서 많이 쓰이는 등급 분류 로직이다. 금액 기준으로 회원 상태를 구분할 수 있다.
반응형
CASE는 SELECT 외에도 어디서나 사용 가능
- ORDER BY 절: 정렬 기준에 조건 부여
- WHERE 절: 조건 자체를 동적으로 설정
- UPDATE 문: 수정값을 조건적으로 처리
- GROUP BY, HAVING 절에서도 응용 가능
예제 3: ORDER BY CASE로 커스텀 정렬
SELECT *
FROM products
ORDER BY
CASE category
WHEN '가전' THEN 1
WHEN '가구' THEN 2
ELSE 3
END;
지정한 순서대로 정렬하려면 CASE를 활용한 인덱스 정렬이 효과적이다.
예제 4: UPDATE 시 조건에 따른 변경
UPDATE orders
SET status = CASE
WHEN shipped_at IS NOT NULL THEN '배송완료'
WHEN paid_at IS NOT NULL THEN '결제완료'
ELSE '결제대기'
END;
배송, 결제 여부에 따라 주문 상태를 한 번에 일괄 업데이트할 수 있다.
CASE와 IF 차이
| 항목 | IF() 함수 | CASE WHEN |
| 조건 수 | 2개만 처리 | 다중 조건 가능 |
| 가독성 | 중첩 시 복잡 | 구조적으로 명확 |
| 실무 활용 | 단순 조건 | 분류, 정렬, 등급 등 복합 조건 |
CASE는 조건이 3개 이상인 경우 무조건 권장된다.
정리
- CASE WHEN은 다중 조건을 순차적으로 평가하고 결과를 반환하는 구조이다.
- IF() 중첩보다 가독성이 좋아 실무에서 자주 사용된다.
- SELECT뿐 아니라 ORDER BY, UPDATE, WHERE 등 어디에서든 활용할 수 있다.
- 등급 부여, 주문 상태 분기, 정렬 순서 정의 등에 탁월한 효과를 발휘한다.
참고 문서
https://dev.mysql.com/doc/refman/8.0/en/control-flow-functions.html#operator_case
반응형
'DB' 카테고리의 다른 글
| [MySQL] 날짜 → 문자열 변환: DATE_FORMAT 응용하기 🗓️ (2) | 2025.07.25 |
|---|---|
| [MySQL] 문자열 → 날짜 변환: STR_TO_DATE 실전 예제 📆 (1) | 2025.07.25 |
| [MySQL] CONVERT 함수와 CAST 차이점 비교 (0) | 2025.07.25 |
| [MySQL] CAST 함수로 데이터 형 변환하기 (0) | 2025.07.25 |
| [MySQL] NULLIF로 두 값 비교 후 조건 처리하기 (3) | 2025.07.25 |
| [MySQL] IFNULL로 NULL 값을 기본값으로 대체하기 (0) | 2025.07.25 |
| [MySQL] IF 함수로 조건 분기 처리하는 법 (0) | 2025.07.25 |
| [MySQL] PI, RAND, SIGN 등 특수 수학 함수 모음 (3) | 2025.07.25 |