CASE 기본 사용법


CASE: 조건 값에 따라 결과를 변경할 수 있는 문법(치환)이다.

CASE  
      WHEN [조건식1] THEN [조건식1이 참일 경우의 값]
      WHEN [조건식2] THEN [조건식2가 참일 경우의 값]
      ...
      ELSE [WHEN 조건식들을 만족하지 못한 경우의 값]
END

아래는 ItemCat에 따른 명칭을 CASE 절로 처리한 예다.

-- [SQL-6-1-1]
SELECT  T1.ItemId ,T1.ItemNm ,T1.ItemCat
        ,CASE   WHEN T1.ItemCat = 'COF' THEN '커피'
                WHEN T1.ItemCat = 'BKR' THEN '베이커리'
                WHEN T1.ItemCat = 'BEV' THEN '음료'
                ELSE 'N/A' END 상품종류
FROM    startdb.Item T1
WHERE   T1.HotColdCd = 'HOT'
AND     T1.ItemSizeCd = 'REG'
ORDER BY T1.ItemCat ,T1.ItemId;

ItemId  ItemNm            ItemCat  상품종류      
------  ----------------  -------  --------  
HCHR    Hot Chocolate(R)  BEV      음료      
BGLR    Bagel(R)          BKR      베이커리  
MACA    Macaron(R)        BKR      베이커리  
AMR     Americano(R)      COF      커피      
CLR     Cafe Latte(R)     COF      커피      
EINR    Einspanner(R)     COF      커피      
FLTR    Flat White(R)     COF      커피      

AND나 OR를 사용해 WHEN 안에 여러 조건을 결합해서 사용할 수 있다. 주문금액에 따라 주문금액구분 컬럼을 추가했다.

-- [SQL-6-1-2]
SELECT  T1.OrdNo ,T1.OrdDtm ,T1.OrdAmt
        ,CASE   WHEN T1.OrdAmt >= 10000                         THEN '높은금액'
                WHEN T1.OrdAmt <  10000 AND T1.OrdAmt >= 5000   THEN '중간금액'
                WHEN T1.OrdAmt <  5000  AND T1.OrdAmt >=0       THEN '낮은금액'
        END 주문금액구분
FROM    startdb.Ord T1
WHERE   T1.ShopId = 'S003'
AND     T1.OrdDtm >= STR_TO_DATE('20200605','%Y%m%d')
AND     T1.OrdDtm <  STR_TO_DATE('20200611','%Y%m%d')
ORDER BY T1.OrdAmt DESC;

OrdNo  OrdDtm               OrdAmt     주문금액구분        
-----  -------------------  ---------  ------------  
3055   2020-06-08 08:00:00  10500.000  높은금액      
3091   2020-06-09 08:00:00  7500.000   중간금액      
3052   2020-06-07 08:00:00  4000.000   낮은금액      
3094   2020-06-10 08:00:00  4000.000   낮은금액      
3013   2020-06-05 08:00:00  3000.000   낮은금액      
3016   2020-06-06 08:00:00  3000.000   낮은금액      

WHEN 조건식이 여러 개 있으면 위에서부터 차례대로 조건을 평가한다. 조건을 만족한 후에는 나머지 조건을 평가하지 않는다. 그러므로 위 SQL은 아래와 같이 변경할 수 있다.

-- [SQL-6-1-3]
SELECT  T1.OrdNo ,T1.OrdDtm ,T1.OrdAmt
        ,CASE   WHEN T1.OrdAmt >= 10000  THEN '높은금액'
                WHEN T1.OrdAmt >= 5000   THEN '중간금액'
                ELSE '낮은금액'
        END 주문금액구분
FROM    startdb.Ord T1
WHERE   T1.ShopId = 'S003'
AND     T1.OrdDtm >= STR_TO_DATE('20200605','%Y%m%d')
AND     T1.OrdDtm <  STR_TO_DATE('20200611','%Y%m%d')
ORDER BY T1.OrdAmt DESC;

OrdNo  OrdDtm               OrdAmt     주문금액구분        
-----  -------------------  ---------  ------------  
3055   2020-06-08 08:00:00  10500.000  높은금액      
3091   2020-06-09 08:00:00  7500.000   중간금액      
3052   2020-06-07 08:00:00  4000.000   낮은금액      
3094   2020-06-10 08:00:00  4000.000   낮은금액      
3013   2020-06-05 08:00:00  3000.000   낮은금액      
3016   2020-06-06 08:00:00  3000.000   낮은금액