CASE 기본 사용법
CASE: 조건 값에 따라 결과를 변경할 수 있는 문법(치환)이다.
•
아래와 같이 사용한다.
CASE
WHEN [조건식1] THEN [조건식1이 참일 경우의 값]
WHEN [조건식2] THEN [조건식2가 참일 경우의 값]
...
ELSE [WHEN 조건식들을 만족하지 못한 경우의 값]
END
SQL
복사
•
하나의 CASE 절에, WHEN ~ THEN 은 여러 개 사용할 수 있다.
•
ELSE에는 앞에서 열거한 WHEN 조건에 모두 만족하지 않았을 경우 치환할 값을 입력한다.
◦
ELSE는 생략할 수 있다.
•
ELSE가 생략된 경우, WHEN 조건에 모두 맞지 않는 데이터는 자동으로 NULL로 치환된다.
◦
ELSE는 하나의 CASE절에 하나만 사용할 수 있다.
아래는 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 커피
SQL
복사
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 낮은금액
SQL
복사
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 낮은금액
SQL
복사
BOOSTER QUIZ
BOOSTER QUIZ ERD
BOOSTER QUIZ 6-1-1
상품종류가 음료이거나 베이커리이면서, 상품크기가 레귤러인 상품을 보여주세요. 이때, Hot/Cold구분을 "차가운","뜨거운"으로 구분해서 보여주세요.
•
대상 테이블: 상품(Item)
•
조회 조건: ItemCat가 BEV(음료)이거나 BKR(베이커리)이면서, ItemSizeCd는 REG(레귤러)인 데이터만
•
조회 컬럼: HotColdNm, ItemId, ItemNm
•
추가 조건
◦
HotColdNm은 CASE를 사용해 처리합니다.
▪
HotColdCd가 HOT이면 '뜨거운', COLD면 '차가운'으로 표시합니다.
◦
주의) 실제 운영 시스템은 이런 코드성 데이터 명칭은 기준코드 테이블로 처리합니다.
▪
여기서는 연습을 위해 CASE를 사용합니다.
•
정렬 기준: HotColdCd로 오름차순 한 후에, ItemId로 오름차순 정렬하시오.
HotColdNm ItemId ItemNm
--------- ------ ---------------
차가운 BMFR 블루베리머핀(R)
차가운 CMFR 초코머핀(R)
차가운 LEMR 레몬에이드(R)
뜨거운 BGLR 베이글(R)
뜨거운 HCHR 핫초코(R)
SQL
복사
BOOSTER QUIZ 6-1-2
2022년 12월 23일 주문을 조회해주세요. 주문번호로 오름차순 해주세요. 주문일시가 12시 이전이면 ‘오전주문’, 주문일시가 12시 이후면 ‘오후주문’으로 표시해주세요.
•
대상 테이블: 주문(Ord)
•
조회 조건: OrdDtm이 2022년 12월 23일
•
조회 컬럼: OrdNo, OrdDtm, MemberId, 오전오후구분
•
추가 조건
◦
오전오후구분은 CASE로 처리합니다.
▪
OrdDtm의 시간이 12:00:00 이하(<=)면 ‘오전주문’으로 출력
▪
OrdDtm의 시간이 12:00:00 초과(>)면 ‘오후주문’으로 출력
•
OrdNo로 오름차순 정렬로 출력하시요.
OrdNo OrdDtm MemberId 오전오후구분
----- ------------------- -------- ------------
57119 2022-12-23 07:30:00 M1040 오전주문
57120 2022-12-23 07:30:00 M2000 오전주문
57121 2022-12-23 07:30:00 M3071 오전주문
57122 2022-12-23 07:30:00 M5000 오전주문
57123 2022-12-23 07:30:00 M6041 오전주문
57124 2022-12-23 07:30:00 M7010 오전주문
... 생략 ...
SQL
복사