2가지 이상의 여러 가지 경우일 때 처리가 가능하므로 다중 분기 라고 부른다.

CASE 문의 형식

CASE
	WHEN 조건1 THEN
		SQL문장들1
	WHEN 조건2 THEN
		SQL문장들2
	WHEN 조건3 THEN
		SQL문장들3
	ELSE
		SQL문장들4
END CASE;

EX. 90점 이상은 A, 80점 이상은 B, 70점 이상은 C, 60점 이상은 D, 60점 미만은 F 로 출력

DROP PROCEDURE IF EXISTS caseProc;

DELIMITER $$
CREATE PROCEDURE caseProc()
BEGIN
	DECLARE point INT;
	DECLARE credit CHAR(1);
	SET point = 88;

	CASE
		WHEN point >= 90 THEN
			SET credit = 'A';
		WHEN point >= 80 THEN
			SET credit = 'B';
		WHEN point >= 70 THEN
			SET credit = 'C';
		WHEN point >= 60 THEN
			SET credit = 'D';
		ELSE 
			SET credit = 'F';
	END CASE;
	SELECT CONCAT('취득점수 ==> ', point), CONCAT('학점 ==> ', credit);
END $$
DELIMITER ;

CALL caseProc();

Untitled

CASE 문의 활용

EX1.

인터넷 마켓 데이터베이스의 회원들의 총 구매액을 계산해서 회원의 등급을 다음과 같이 4단계로 나누려고 한다.

총 구매액 회원 등급
1500 이상 최우수고객
1000 ~ 1499 우수고객
1 ~ 999 일반고객
0 이하 유령고객
  1. 구매 테이블(buy)에서 회원별로 총구매액 구하고, 총 구매액이 많은 순서로 정렬

    SELECT mem_id, SUM(price*amount) "총구매액"
    	FROM buy
    	GROUP BY mem_id
    	ORDER BY SUM(price*amount) DESC;
    

    Untitled

  2. 회원 이름 출력

    SELECT M.mem_id, M.mem_name, SUM(price*amount) "총구매액"
    	FROM buy B
    		RIGHT OUTER JOIN member M
    		ON B.mem_id = M.mem_id
    	GROUP BY M.mem_id
    	ORDER BY SUM(price*amount) DESC;
    

    Untitled

  3. 총 구매액에 따라 회원 등급 구분

    CASE
    	WHEN (총구매액 >= 1500) THEN '최우수고객'
    	WHEN (총구매액 >= 1000) THEN '우수고객'
    	WHEN (총구매액 >= 1) THEN '일반고객'
    	ELSE '유령고객'
    END
    
  4. 전체 코드

    SELECT M.mem_id, M.mem_name, SUM(price*amount) "총구매액",
    		CASE
    			WHEN (SUM(price*amount) >= 1500) THEN '최우수고객'
    			WHEN (SUM(price*amount) >= 1000) THEN '우수고객'
    			WHEN (SUM(price*amount) >= 1) THEN '일반고객'
    			ELSE '유령고객'
    		END "회원등급"
    	FROM buy B
    		RIGHT OUTER JOIN member M
    		ON B.mem_id = M.mem_id
    	GROUP BY M.mem_id
    	ORDER BY SUM(price*amount) DESC;
    

    Untitled