본문 바로가기
카테고리 없음

[SQL] CASE WHEN 조건문으로 복잡한 로직 구현하기

by business27 2025. 8. 14.

SQL은 단순히 데이터를 읽어오는 것뿐만 아니라, 쿼리 안에서 조건에 따라 값을 다르게 계산하는 로직을 구현할 수도 있습니다. 이때 가장 강력하게 쓰이는 도구가 바로 CASE WHEN 구문입니다. 이번 글에서는 CASE WHEN의 기본 문법부터 다중 조건 처리, 계산식·집계함수와 함께 사용하기, 그리고 실무에서 자주 쓰는 패턴까지 총정리하겠습니다. 함께 알아봐보시죠! 

 

 

 

 

[SQL] CASE WHEN 조건문으로 복잡한 로직 구현하기

 

 

 

 

 

CASE WHEN 기본 문법

CASE WHEN 구문은 프로그래밍 언어의 if-else와 비슷합니다.

 

📌 기본 구조

CASE
WHEN 조건1 THEN 결과1
WHEN 조건2 THEN 결과2
...
ELSE 기본값
END


* WHEN: 조건을 지정

* THEN: 해당 조건이 참일 때 반환할 값

* ELSE: 모든 조건이 거짓일 때 반환할 값 (선택 사항)

* END: CASE 구문 종료

 

 

📌 간단 예제

SELECT
product_name,
CASE
WHEN price >= 50000 THEN '고가'
WHEN price >= 20000 THEN '중가'
ELSE '저가'
END AS price_category
FROM products;

 

→ 상품 가격에 따라 고가/중가/저가로 분류.

 

💡 TIP

* MySQL, PostgreSQL, SQL Server 모두 문법이 거의 동일합니다.

* 단, CASE는 SELECT 절, WHERE 절, ORDER BY 절 어디서든 사용할 수 있습니다.

 

 

 

 

단일 CASE vs Searched CASE

CASE 문은 두 가지 방식으로 작성할 수 있습니다.

 

1) Simple CASE

하나의 표현식을 기준으로 비교

CASE grade
WHEN 'A' THEN '최우수'
WHEN 'B' THEN '우수'
ELSE '일반'
END

 


2) Searched CASE

조건식을 직접 작성

CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
ELSE 'C'
END

 

→ 실무에서는 대부분 Searched CASE를 사용합니다. 이유는 더 유연하기 때문입니다.

 

 

3) CASE WHEN을 SELECT에서 활용

SELECT 절에서 새로운 컬럼 값을 계산할 수 있습니다.

 

📌 예제: 나이대 구분

SELECT
name,
age,
CASE
WHEN age < 20 THEN '청소년'
WHEN age BETWEEN 20 AND 39 THEN '청년'
WHEN age BETWEEN 40 AND 59 THEN '중년'
ELSE '노년'
END AS age_group
FROM members;

 

→ 나이에 따라 그룹화된 결과 컬럼을 생성.

 

 

📌 예제: 할인율 계산

SELECT
product_name,
price,
CASE
WHEN price >= 100000 THEN price * 0.8
WHEN price >= 50000 THEN price * 0.9
ELSE price
END AS discounted_price
FROM products;

 

→ 가격 구간별 할인 로직 구현.

 

 

 

 

CASE WHEN을 WHERE 절에서 활용

조건문을 WHERE 안에 넣어 필터링을 유연하게 만들 수 있습니다.

 

📌 예제: 회원 등급별 검색

SELECT *
FROM customers
WHERE
CASE
WHEN membership = 'VIP' THEN points >= 1000
WHEN membership = 'REGULAR' THEN points >= 500
ELSE points >= 100
END;

 

→ 회원 등급에 따라 다른 기준으로 필터링.

 

💡 하지만 WHERE 절에서 CASE WHEN을 쓰면 가독성이 떨어질 수 있으니,
필요할 때만 사용하고, 가능하면 조건을 직접 나누는 게 좋습니다.

* CASE WHEN을 ORDER BY에서 활용
* ORDER BY 절에 CASE WHEN을 쓰면 사용자 정의 정렬이 가능합니다.

 

 

📌 예제: 특정 값 우선 정렬

SELECT product_name, stock_status
FROM products
ORDER BY
CASE stock_status
WHEN '재고부족' THEN 1
WHEN '재고있음' THEN 2
ELSE 3
END;

 

→ 특정 상태값이 먼저 나오도록 순서를 지정.

 

* CASE WHEN + 집계 함수 조합
집계할 때 CASE WHEN을 사용하면 조건부 합계·평균을 쉽게 구할 수 있습니다.

 

 

📌 예제: 상태별 매출 합계

SELECT
SUM(CASE WHEN status = '완료' THEN amount ELSE 0 END) AS completed_sales,
SUM(CASE WHEN status = '취소' THEN amount ELSE 0 END) AS canceled_sales
FROM orders;

 

→ 하나의 쿼리에서 조건별 매출 합계를 동시에 계산.

 

 

📌 예제: 구간별 회원 수

SELECT
SUM(CASE WHEN age < 20 THEN 1 ELSE 0 END) AS teens,
SUM(CASE WHEN age BETWEEN 20 AND 39 THEN 1 ELSE 0 END) AS young_adults,
SUM(CASE WHEN age BETWEEN 40 AND 59 THEN 1 ELSE 0 END) AS middle_aged,
SUM(CASE WHEN age >= 60 THEN 1 ELSE 0 END) AS seniors
FROM members;

 

→ 나이대별 회원 수를 집계.

 

 

 

 

실무 활용 패턴

1) 등급·레벨 분류

SELECT
    user_id,
    points,
    CASE
        WHEN points >= 5000 THEN '플래티넘'
        WHEN points >= 2000 THEN '골드'
        WHEN points >= 1000 THEN '실버'
        ELSE '브론즈'
    END AS grade
FROM users;

 


2) 기간별 상태 구분

SELECT
    order_id,
    order_date,
    CASE
        WHEN order_date >= CURDATE() - INTERVAL 7 DAY THEN '최근 주문'
        WHEN order_date >= CURDATE() - INTERVAL 30 DAY THEN '이번 달 주문'
        ELSE '이전 주문'
    END AS order_period
FROM orders;

 

 


3) 다중 조건 + 계산식

SELECT
    product_name,
    price,
    CASE
        WHEN category = '전자제품' AND price >= 100000 THEN price * 0.85
        WHEN category = '의류' AND price >= 50000 THEN price * 0.9
        ELSE price
    END AS final_price
FROM products;

 

→ 조건이 복합적인 할인 로직 구현.

 

 

 

성능 고려 사항

CASE WHEN은 조건문이 많아질수록 가독성이 떨어지고, 복잡한 계산에서는 성능 저하가 발생할 수 있습니다.

 

* 조건 개수가 많으면 매핑 테이블을 만들어 JOIN하는 방법이 더 효율적일 수 있음

* WHERE 절의 CASE는 인덱스 사용을 방해할 수 있음
    → 가능하면 인덱스를 탈 수 있도록 조건 분리

* 단순 값 변환이라면 DECODE(Oracle)나 IIF(SQL Server) 같은 함수도 고려

 

 

 

마무리

CASE WHEN은 SQL에서 복잡한 로직을 구현할 수 있는 강력한 도구입니다.

* SELECT 절 → 새로운 컬럼 계산

* WHERE 절 → 조건부 필터링

* ORDER BY 절 → 사용자 정의 정렬

* 집계 함수와 조합 → 조건별 통계 계산

이 구문을 능숙하게 다루면, 애플리케이션에서 처리하던 로직을 SQL 내부에서 해결해
쿼리 한 번으로 깔끔하게 결과를 만들 수 있습니다.