MySQL의 CASE 문은 SELECT 절이나 WHERE 절과 같은 쿼리 내부에서 조건 분기를 처리할 수 있게 해주는 강력한 제어 흐름 함수입니다. 프로그래밍 언어의 if-else 구문과 유사한 역할을 하며, 상황에 따라 서로 다른 값을 반환하도록 로직을 구성할 수 있습니다.
MySQL에서 CASE 문은 크게 두 가지 문법으로 나뉩니다. 각각의 문법과 동작 방식을 자세히 살펴보겠습니다.
문법 1: 값 비교 방식 (Simple CASE)
CASE val WHEN compare_val1 THEN result1 WHEN compare_val2 THEN result2 . . . ELSE result END
첫 번째 문법은 특정 값(val)을 여러 비교값과 일대일로 대조하는 방식입니다. 만약 val이 compare_val1과 같다면 CASE 문은 result1을 반환하고, compare_val2와 같다면 result2를 반환합니다. 이런 식으로 WHEN 절이 추가되는 만큼 순차적으로 비교가 진행됩니다.
만약 모든 비교값과 일치하지 않는다면, ELSE 절에 지정된 result를 반환하게 됩니다. 참고로 ELSE 절이 생략된 경우에는 NULL을 반환합니다.
예제 1
mysql> Select CASE 100
-> WHEN 100 THEN 'It is matched'
-> WHEN 200 THEN 'It is not matched'
-> ELSE 'No use of this Number'
-> END as 'Matching the Number';
+---------------------+
| Matching the Number |
+---------------------+
| It is matched |
+---------------------+
1 row in set (0.06 sec)위 예제에서 CASE 뒤의 값은 100이고, 첫 번째 WHEN 조건도 100이므로 두 값이 일치하여 결과로 'It is matched'가 반환됩니다.
문법 2: 조건 평가 방식 (Searched CASE)
CASE WHEN condition_1 THEN result1 WHEN condition_2 THEN result2 . . . ELSE result END
두 번째 문법은 단순한 값 비교가 아닌, 각각의 조건식(condition)을 직접 평가하는 방식입니다. 조건이 참(TRUE)이면 해당 THEN 절의 result1, result2 등이 반환됩니다. WHEN 절들은 위에서부터 순서대로 평가되며, 처음 참이 되는 조건의 결과값이 반환된 후 나머지 조건은 더 이상 검사하지 않습니다.
모든 조건이 거짓(FALSE)일 경우에는 ELSE 절에 지정된 result를 반환합니다.
예제 2
mysql> Select CASE
-> WHEN (100 = 100) THEN 'It is Matched'
-> WHEN (200 = 100) Then 'It is Not Matched'
-> Else 'No use of Number'
-> END as 'Matching the Number';
+---------------------+
| Matching the Number |
+---------------------+
| It is Matched |
+---------------------+
1 row in set (0.00 sec)위 예제에서 첫 번째 조건인 (100 = 100)은 참이므로 결과로 'It is Matched'가 반환됩니다. 두 번째 조건은 평가되지 않으며, 이것이 CASE 문의 효율적인 동작 방식입니다.
두 문법의 차이점 정리
- 문법 1(Simple CASE): 하나의 기준값과 여러 후보값을 비교할 때 적합하며, 등호(=) 비교만 가능합니다.
- 문법 2(Searched CASE): 범위 조건(>, <), 복합 조건(AND, OR) 등 다양한 논리식을 활용할 수 있어 더욱 유연합니다.
CASE 문은 데이터를 카테고리별로 분류하거나, 조건에 따라 다른 정렬 기준을 적용하는 등 실무에서 매우 자주 활용되는 필수 함수이므로 두 가지 문법을 모두 익혀두는 것이 좋습니다.