기록
database - CASE 식 (CASE WHEN , ELSE , END) 본문
CASE식은 명칭이 가르키듯이 경우 구분을 기술할 때 사용한다.
프로그래밍에서는 '조건 분기'라고 칭한다.
CASE 식 구문에는 단순 CASE식과 검색 CASE식이 있다.
먼저 검색 CASE구문을 살펴보자.
CASE WHEN <평가식> THEN <식>
WHEN <평가식> THEN <식>
WHEN <평가식> THEN <식>
...
ELSE <식>
END
WHEN 구의 <평가식>이란, '열=값'과 같이 반환값이 진리값이 되는 식을 말한다.
=, !=, LIKE, BETWEEN 같은 술어를 사용해서 만든 식이라고 보면 된다.
실제로 사용해보자.
SELECT goods_name,
CASE WHEN goods_classify = '의류'
THEN CONCAT('A:', goods_classify) # THEN 'A:' || goods_classify
WHEN goods_classify = '사무용품'
THEN CONCAT('B:', goods_classify) # THEN 'B:' || goods_classify
WHEN goods_classify = '주방용품'
THEN CONCAT('C:', goods_classify) # THEN 'C:' || goods_classify
ELSE NULL
END AS abc_classify
FROM Goods;
CASE 구의 ELSE를 생략할 수 있지만 명시적으로 기술하는 것이 좋다.
END는 생략할 수 없다. 초보자가 자주하는 실수 중 하나.
이 CASE 식이 편리한 것은 바로 '식'이라는 점이다.
식을 사용할 수 있는 곳이라면 어디든지 CASE식을 사용할 수 있다.
즉, '1+1'을 쓸 수 있는 곳이라면 어디든지 가능하다.
예를들어, 편리한 사용법 중 하나가 다음과 같이 SELECT문 결과를 행렬 변환하는 것이다.
이것은 상품분류 별로 판매단가를 합한 결과다.
GROUP BY 구로 집약한다 해도 결과는 '행'으로 출력되지, '열로 출력할 수 없다.
-- GROUP BY 이용
SELECT goods_classify, SUM(sell_price)
FROM Goods
GROUP BY goods_classify;
-- CASE 식 이용
SELECT SUM(CASE WHEN goods_classify = '의류'
THEN sell_price ELSE 0 END) AS 의류가격총합,
SUM(CASE WHEN goods_classify = '주방용품'
THEN sell_price ELSE 0 END) AS 주방용품가격총합,
SUM(CASE WHEN goods_classify = '사무용품'
THEN sell_price ELSE 0 END) AS 사무용품가격총합
FROM Goods;
이와 같이 CASE 식은 SELECT 문의 결과를 유연하게 재조합 할 경우에 큰 힘을 발휘한다.
<검색 CASE식과 단순 CASE식의 차이>
지금까지 우리가 알아본 것은 검색 CASE 식이다.
단순 CASE식은 작성법이 간단하지만 기술할 수 있는 조건이 제한적이다.
이때문에 기본적으론 검색 CASE식을 사용하는 것이 좋다.
-- 검색 CASE식을 사용한 상품분류에 A~C 문자열 지정
SELECT goods_name,
CASE WHEN goods_classify = '의류'
THEN CONCAT('A:', goods_classify)
WHEN goods_classify = '사무용품'
THEN CONCAT('B:', goods_classify)
WHEN goods_classify = '주방용품'
THEN CONCAT('C:', goods_classify)
ELSE NULL
END AS abc_classify
FROM Goods;
-- 단순 CASE식 사용
SELECT goods_name,
CASE goods_classify
WHEN '의류' THEN CONCAT('A:', goods_classify)
WHEN '사무용품' THEN CONCAT('B:', goods_classify)
WHEN '주방용품' THEN CONCAT('C:', goods_classify)
ELSE NULL
END AS abc_classify
FROM Goods;
단순 CASE식에는 평가하고 싶은 식을 기술한 후, WHEN 구에서 한 번 더 'goods_classify'를 기술할 필요가 없다.
이런 점은 편리하지만, 반대로 WHEN 구별로 다른 열에 대한 조건을 지정하고 싶을 땐 단순 CASE식으로 구현할 수 없다.
'[Study] > Database' 카테고리의 다른 글
database - 결합(JOIN) (0) | 2019.08.03 |
---|---|
database - 집합 연산(UNION, INTERSECT, EXCEPT) (0) | 2019.08.02 |
database - 술어 (LIKE, BETWEEN, IS NULL, IN, EXISTS) (0) | 2019.07.31 |
database - 다양한 함수 (날짜함수, 변환함수) (0) | 2019.07.30 |
database - 다양한 함수 (산술함수, 문자열함수) (0) | 2019.07.30 |