MySQL의 CASE 문은 사실상 IF-THEN-ELSE 문과 동일한 기능을 수행합니다. 여러 조건을 순차적으로 검사하여 해당 조건이 참일 때 특정 구문을 실행할 수 있어, 저장 프로시저 내에서 복잡한 분기 로직을 깔끔하게 처리하는 데 매우 유용합니다.
CASE 문 기본 문법
CASE
WHEN condition_1 THEN
{...condition_1이 TRUE일 때 실행할 구문...}
[ WHEN condition_2 THEN
{...condition_2가 TRUE일 때 실행할 구문...} ]
[ WHEN condition_n THEN
{...condition_n이 TRUE일 때 실행할 구문...} ]
[ ELSE
{...모든 조건이 FALSE일 때 실행할 구문...} ]
END CASE;WHEN 절의 어떤 조건도 충족되지 않으면, CASE 문은 ELSE 절을 실행합니다. ELSE 절이 없고 모든 조건이 거짓이라면 오류가 발생하므로 주의해야 합니다.
예제 테이블 준비하기
저장 프로시저에서 CASE 문을 실제로 활용하는 방법을 살펴보겠습니다. 아래와 같은 데이터를 가진 'student_info' 테이블을 예제로 사용합니다.
mysql> Select * from student_info; +------+---------+------------+------------+ | id | Name | Address | Subject | +------+---------+------------+------------+ | 101 | YashPal | Amritsar | History | | 105 | Gaurav | Jaipur | Literature | | 125 | Raman | Shimla | Computers | +------+---------+------------+------------+ 3 rows in set (0.00 sec)
CASE 문이 포함된 저장 프로시저 생성하기
다음 쿼리는 과목명을 입력받아 해당 과목에 맞는 학위 과정을 반환하는 'coursedetails_CASE'라는 저장 프로시저를 생성합니다. 이 프로시저 안에 CASE 문이 포함되어 있습니다.
mysql> Delimiter //
mysql> CREATE PROCEDURE coursedetails_CASE(IN S_subject Varchar(20), OUT S_Course Varchar(50))
-> BEGIN
-> DECLARE SUB VArchar(20);
-> SELECT SUBJECT INTO Sub
-> FROM Student_Info WHERE S_Subject = Subject;
-> CASE S_Subject WHEN 'Computers' THEN
-> SET S_Course = 'B.Tech(CSE)';
-> WHEN 'History' THEN
-> SET S_Course = 'Masters in History';
-> WHEN 'Literature' THEN
-> SET S_Course = 'Masters in English';
-> ELSE
-> SET S_Course = 'Subject not in the table';
-> END CASE ;
-> END //
Query OK, 0 rows affected (0.11 sec)프로시저는 두 개의 파라미터를 사용합니다. S_subject는 입력값(IN)으로 과목명을 받고, S_Course는 출력값(OUT)으로 결과를 담아 반환합니다. CASE 문은 입력된 과목명에 따라 각각 다른 학위 과정을 설정하며, 일치하는 과목이 없으면 ELSE 절이 실행됩니다.
저장 프로시저 호출 및 결과 확인하기
이제 프로시저를 호출하여 각 조건별로 어떻게 동작하는지 확인해 보겠습니다.
'Computers' 과목 입력 시
mysql> DELIMITER ;
mysql> CALL coursedetails_CASE ('Computers', @S_course);
Query OK, 1 row affected (0.08 sec)
mysql> Select @S_Course;
+-------------+
| @S_Course |
+-------------+
| B.Tech(CSE) |
+-------------+
1 row in set (0.00 sec)'literature' 과목 입력 시
mysql> CALL coursedetails_CASE ('literature', @S_course);
Query OK, 1 row affected (0.00 sec)
mysql> Select @S_Course;
+--------------------+
| @S_Course |
+--------------------+
| Masters in English |
+--------------------+
1 row in set (0.00 sec)테이블에 없는 'Math' 과목 입력 시
mysql> CALL coursedetails_CASE ('Math', @S_course);
Query OK, 0 rows affected (0.00 sec)
mysql> Select @S_Course;
+--------------------------------+
| @S_Course |
+--------------------------------+
| Subject Not in the table |
+--------------------------------+
1 row in set (0.00 sec)'History' 과목 입력 시
mysql> CALL coursedetails_CASE ('History', @S_course);
Query OK, 1 row affected (0.01 sec)
mysql> Select @S_Course;
+--------------------+
| @S_Course |
+--------------------+
| Masters in History |
+--------------------+
1 row in set (0.00 sec)정리
실행 결과에서 확인할 수 있듯이, CASE 문은 입력값에 따라 정확히 분기 처리를 수행합니다. 'Computers'는 'B.Tech(CSE)'를, 'Literature'는 'Masters in English'를, 'History'는 'Masters in History'를 반환했으며, 테이블에 존재하지 않는 'Math'가 입력되었을 때는 ELSE 절이 실행되어 'Subject not in the table'이라는 메시지를 반환했습니다.
이처럼 MySQL 저장 프로시저에서 CASE 문을 활용하면 조건별 분기 로직을 명확하고 효율적으로 구현할 수 있습니다. IF-THEN-ELSEIF 구문보다 여러 조건을 비교할 때 코드 가독성이 뛰어나므로, 상황에 맞게 적절히 활용해 보시기 바랍니다.