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 낮은금액