티스토리 뷰
📌 SQL CASE 문
SQL의 'CASE' 문은 쿼리 내의 조건부 논리에 사용되는 함수입니다.
기존 프로그래밍 언어의 "if-else" 구조와 마찬가지로 다양한 조건에 따라 다양한 작업을 수행할 수 있습니다.
이는 계산된 열을 생성하거나, 결과를 필터링하거나, 쿼리 내에서 데이터를 변환하는 데 도움이 될 수 있습니다.
📌 기본 사용법
- 순차적으로 조건을 확인하고, 조건이 만족되면 해당 결과를 반환합니다.
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
WHEN condition3 THEN result3
ELSE default_result
END
-
- WHEN: 평가할 조건을 정의합니다.
- THEN: 조건이 true인 경우 결과를 지정합니다.
- ELSE: 조건 중 어느 것도 true가 아닌 경우 기본 결과를 제공하는 선택적 부분입니다.
📌 사용 예제
1. CASE로 데이터 분류
다음 열이 포함된 'sales'라는 테이블이 있다고 가정해 보겠습니다.
-
- sale_id(판매 ID)
- amount(판매 금액)
- category(판매 카테고리)
CASE문을 이용하여 판매량을 기준으로 'Low', 'Medium', 'High'로 판매량을 분류할 수 있습니다.
SELECT
sale_id,
amount,
CASE
WHEN amount < 100 THEN 'Low'
WHEN amount BETWEEN 100 AND 500 THEN 'Medium'
WHEN amount > 500 THEN 'High'
ELSE 'Unknown'
END AS sale_category
FROM sales;
-
- WHEN amount < 100 THEN 'Low' : '판매 금액'이 100보다 작으면 결과는 'Low'이 됩니다.
- WHEN amount BETWEEN 100 AND 500 THEN 'Medium' : '판매 금액'이 100에서 500 사이인 경우 결과는 'Medium'이 됩니다.
- WHEN amount > 500 THEN 'High' : '판매 금액'이 500보다 크면 결과는 'High'이 됩니다.
- ELSE 'Unknown' : 위의 조건 중 어느 것도 충족되지 않으면 결과는 Unknown이 됩니다.
2. 집계 및 요약을 위해 CASE 사용
'CASE' 문은 조건에 따라 데이터를 집계하거나 요약하는 데에도 사용할 수 있습니다.
예를 들어, 각 카테고리(낮음, 중간, 높음)에 속하는 판매량을 계산하려면 집계와 함께 CASE를 사용할 수 있습니다.
SELECT
COUNT(CASE WHEN amount < 100 THEN 1 END) AS low_sales,
COUNT(CASE WHEN amount BETWEEN 100 AND 500 THEN 1 END) AS medium_sales,
COUNT(CASE WHEN amount > 500 THEN 1 END) AS high_sales
FROM sales;
- COUNT(CASE WHEN amount < 100 THEN 1 END) : 판매 금액이 100 미만인 모든 매출을 집계합니다.
- medium_sales 및 high_sales의 경우 해당 금액이 해당 범위에 속하는 매출 집계 계산합니다.
3. WHERE 절을 사용한 필터링의 CASE
'CASE'를 사용하여 'WHERE' 절의 조건에 따라 행을 필터링할 수도 있습니다.
단순한 비교보다 더 많은 유연성이 필요할 때 특히 유용합니다.
SELECT sale_id, amount
FROM sales
WHERE
CASE
WHEN amount < 100 THEN 'Low'
WHEN amount BETWEEN 100 AND 500 THEN 'Medium'
ELSE 'High'
END = 'Medium';
-
- 카테고리가 "Medium"인 모든 매출을 반환합니다.
- 'WHERE' 절 내부의 'CASE' 문은 매출을 분류하고 그에 따라 필터링하는 데 사용됩니다.
📌 고급 사용 예제
좀 더 복잡한 예를 생각해 보겠습니다.
user_id, transaction_type, amount가 포함된 transactions 테이블이 있다고 가정해 보세요.
거래 유형(예: "구매", "환불")별로 구분하여 각 사용자의 총액을 계산하려고 합니다.
SELECT
user_id,
SUM(CASE WHEN transaction_type = 'Purchase' THEN amount ELSE 0 END) AS total_purchases,
SUM(CASE WHEN transaction_type = 'Refund' THEN amount ELSE 0 END) AS total_refunds
FROM transactions
GROUP BY user_id;
-
- SUM() 내부의 CASE 문은 "구매", "환불"과 같은 특정 거래 유형에 대해서만 합계 금액을 돕습니다.
- 'ELSE 0'은 다른 트랜잭션 유형의 경우 값이 0임을 보장합니다.
📌 GOOD 사용법
1. 명확하고 읽기 쉬운 조건
-
- 복잡한 논리를 단순화하는 데 사용되는 'CASE'를 사용하면 쿼리를 더 쉽게 이해할 수 있습니다.
2. 집계 및 요약
-
- 동적 범주 또는 조건부 집계(예: 조건에 따른 계산 또는 합계)를 만드는 데 유용합니다.
3. ELSE의 기본 동작
-
- 예상치 못한 값을 처리하기 위해 ELSE 절을 제공하여 가능한 모든 조건을 고려하는 것이 좋습니다.
📌 BAD 사용법
1. 중첩된 CASE 문 남용
-
- 여러 개의 'CASE' 문을 서로 중첩하면 쿼리를 읽고 유지하기가 어려워질 수 있습니다.
SELECT
CASE
WHEN amount < 100 THEN
CASE
WHEN type = 'A' THEN 'Low - A'
ELSE 'Low - Other'
END
WHEN amount BETWEEN 100 AND 500 THEN 'Medium'
ELSE 'High'
END AS sale_category
FROM sales;
2. NULL 값을 처리하지 않음
-
- 데이터에 'NULL' 값이 포함되어 있고 이를 'CASE'로 처리하지 않으면 부정확하거나 예상치 못한 결과가 발생할 수 있습니다.
데이터를 분류하든, 조건부 집계를 수행하든, 결과를 필터링하든 뛰어난 유연성을 제공합니다.
그러나 다른 도구와 마찬가지로 이 도구도 신중하게 사용해야 합니다. 조건을 단순하게 유지하고,
불필요한 중첩을 피하고, 항상 'NULL' 값을 적절하게 처리하도록 하세요.
'CASE' 문은 동적이고 읽기 쉽고 유연한 SQL 쿼리를 작성할 수 있어 데이터 분석이 효율적이 됩니다.