두 개 이상의 값을 비교하거나 고정된 개수의 조건에 따라 다른 결과를 출력해야 할 때는 MySQL의 CASE 문을 사용하는 것이 가장 효과적입니다. CASE 문은 조건을 평가한 뒤 해당 조건이 참일 때 지정한 값을 반환하므로, 쿼리 결과를 훨씬 직관적이고 가독성 좋게 만들어 줍니다.
MySQL CASE 문 기본 문법
CASE 문의 기본적인 사용 형식은 다음과 같습니다.
SELECT *,
CASE WHEN 컬럼명1 > 컬럼명2 THEN '메시지1'
ELSE '메시지2'
END AS 별칭
FROM 테이블명;위 문법을 실제로 이해하기 위해 간단한 예제 테이블을 만들어 보겠습니다.
예제 테이블 생성하기
먼저 두 개의 숫자 컬럼을 가진 테이블을 생성합니다.
mysql> create table CaseFunctionDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Value1 int,
-> Value2 int
-> );
Query OK, 0 rows affected (0.56 sec)데이터 삽입하기
INSERT 명령을 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into CaseFunctionDemo(Value1,Value2) values(10,20); Query OK, 1 row affected (0.21 sec) mysql> insert into CaseFunctionDemo(Value1,Value2) values(100,40); Query OK, 1 row affected (0.10 sec) mysql> insert into CaseFunctionDemo(Value1,Value2) values(0,20); Query OK, 1 row affected (0.15 sec) mysql> insert into CaseFunctionDemo(Value1,Value2) values(0,-50); Query OK, 1 row affected (0.12 sec)
저장된 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from CaseFunctionDemo;
실행 결과는 다음과 같습니다.
+----+--------+--------+ | Id | Value1 | Value2 | +----+--------+--------+ | 1 | 10 | 20 | | 2 | 100 | 40 | | 3 | 0 | 20 | | 4 | 0 | -50 | +----+--------+--------+ 4 rows in set (0.00 sec)
CASE 문으로 두 값 비교하기
이제 CASE 문을 적용하여 Value1과 Value2 중 어느 값이 더 큰지 한눈에 확인할 수 있는 쿼리를 작성해 보겠습니다.
mysql> select*, case when Value1>Value2 then 'Value1 is Greater' else 'Value2 is Greater' end AS Comparision from CaseFunctionDemo;
실행 결과는 다음과 같습니다.
+----+--------+--------+-------------------+ | Id | Value1 | Value2 | Comparision | +----+--------+--------+-------------------+ | 1 | 10 | 20 | Value2 is Greater | | 2 | 100 | 40 | Value1 is Greater | | 3 | 0 | 20 | Value2 is Greater | | 4 | 0 | -50 | Value1 is Greater | +----+--------+--------+-------------------+ 4 rows in set (0.00 sec)
결과에서 볼 수 있듯이, CASE 문은 각 행마다 조건을 평가하여 Value1이 더 크면 'Value1 is Greater', 그렇지 않으면 'Value2 is Greater'라는 문자열을 반환합니다. 이처럼 CASE 문을 활용하면 별도의 애플리케이션 로직 없이도 데이터베이스 쿼리 내에서 조건 분기를 처리할 수 있어 코드가 간결해지고 성능 면에서도 유리합니다.