티스토리 뷰

 

 

 

 

📌 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 쿼리를 작성할 수 있어 데이터 분석이 효율적이 됩니다.

 

 

 

반응형