기록

database - CASE 식 (CASE WHEN , ELSE , END) 본문

[Study]/Database

database - CASE 식 (CASE WHEN , ELSE , END)

Dannnnnn 2019. 8. 2. 17:49
반응형

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식으로 구현할 수 없다.

 

 

반응형