본문 바로가기

Skills/SQL

SQL CASE WHEN 효율적 사용법: 단일 vs 중첩 CASE WHEN 구문

반응형

 

단일 vs 중첩 CASE WHEN 구문을 비교해 보면서 각각의 장단점에 대해 설명해 드리겠습니다.

 

우선 테스트용 데이터를 생성하기 위해 아래와 같은 테이블을 생성하고 데이터를 삽입해 보겠습니다.

CREATE TABLE sales (
    id INT PRIMARY KEY,
    country VARCHAR(50),
    tiering VARCHAR(50)
);
INSERT INTO sales (id, country, tiering)
VALUES
    (1, 'KR', 'Tier 1'),
    (2, 'KR', 'Tier 2'),
    (3, 'KR', 'Tier 3'),
    (4, 'US', 'Tier 1'),
    (5, 'US', 'Tier 2'),
    (6, 'US', 'Tier 3'),
    (7, 'JP', 'Tier 1'),
    (8, 'JP', 'Tier 2'),
    (9, 'JP', 'Tier 3');

 

country컬럼은 는 'KR', 'JP', 'US' 세 가지 값이 있고, tiering은 판매에 따른 등급을 나타내는 데이터입니다.

 

country와 tiering에 따라 rate이 다르게 설정되어야 한다면 우선 아래와 같은 단일 CASE WHEN문으로 작성 가능합니다.

select
    id,
    country,
    tiering,
    case   
        when country = 'KR' and tiering = 'Tier 1' then '1%'
        when country = 'KR' and tiering = 'Tier 2' then '2%'
        when country = 'KR' and tiering = 'Tier 3' then '3%'     
        when country = 'JP' and tiering = 'Tier 1' then '2%'
        when country = 'JP' and tiering = 'Tier 2' then '3%'
        when country = 'JP' and tiering = 'Tier 3' then '4%'      
        when country = 'US' and tiering = 'Tier 1' then '3%'
        when country = 'US' and tiering = 'Tier 2' then '4%'
        when country = 'US' and tiering = 'Tier 3' then '5%'
    end as rate
from
    sales;

 

이 쿼리는 sales 테이블에서 데이터를 가져와 각 행의 country와 tiering 값을 기반으로 rate 값을 계산합니다. 

rate 값은 결과 데이터 세트에 새로운 열로 추가됩니다.

단일 case when 사용

 

다음으로는 중첩된 CASE WHEN문을 사용한 쿼리와 그 결과를 살펴보겠습니다.

SELECT
    id,
    country,
    tiering,
    CASE
        WHEN country = 'KR' THEN
            CASE
                WHEN tiering = 'Tier 1' THEN '1%'
                WHEN tiering = 'Tier 2' THEN '2%'
                WHEN tiering = 'Tier 3' THEN '3%'
            END
        WHEN country = 'JP' THEN
            CASE
                WHEN tiering = 'Tier 1' THEN '2%'
                WHEN tiering = 'Tier 2' THEN '3%'
                WHEN tiering = 'Tier 3' THEN '4%'
            END
        WHEN country = 'US' THEN
            CASE
                WHEN tiering = 'Tier 1' THEN '3%'
                WHEN tiering = 'Tier 2' THEN '4%'
                WHEN tiering = 'Tier 3' THEN '5%'
            END
    END AS rate
FROM
    sales;

 

이 쿼리 역시 sales 테이블에서 데이터를 가져와 country와 tiering 값을 기반으로 rate 값을 계산합니다.

중첩 case when 사용 (결과 동일)

 

단일 CASE WHEN을 사용한 첫 번째 쿼리에서는 

각 조건에 따른 결과가 바로 나열되어 있기 때문에, 조건과 그에 따른 결과를 한 번에 볼 수 있습니다. 

이는 코드를 읽는 사람이 각 조건에 따른 동작을 바로 이해할 수 있도록 돕습니다.

 

반면에 중첩된 CASE WHEN문을 사용한 두 번째 쿼리는 

코드의 줄 수를 줄였지만, 복잡한 로직을 필요로 합니다. 

 

처음 코드를 보는 사람이 이 로직을 이해하는 데 시간이 더 걸릴 수 있지만, 

같은 로직의 반복을 줄이므로 특정 상황에서는 더욱 유용할 수 있습니다.

 

따라서 상황에 맞게 적절한 구문을 선택해서 사용하는 것이 중요합니다.

반응형