MySQL에서 특정 열에 저장된 'a' 값을 'b'로, 'b' 값을 'a'로 한 번에 바꾸고 싶다면 CASE 문을 사용하면 간단하게 해결할 수 있습니다. 이번 글에서는 예제 테이블을 만들고, UPDATE 쿼리와 CASE 문을 조합해 두 값을 손쉽게 스왑하는 과정을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 char(1) 타입의 Value 컬럼 하나만 가진 테이블을 생성합니다.
mysql> create table DemoTable
(
Value char(1)
);
Query OK, 0 rows affected (1.21 sec)2. 샘플 데이터 삽입
INSERT 명령어를 이용해 'a'와 'b' 값을 번갈아가며 입력합니다.
mysql> insert into DemoTable values('a');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('b');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('a');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable values('a');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('b');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable values('a');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('b');
Query OK, 1 row affected (0.13 sec)3. 현재 데이터 확인
SELECT 문으로 테이블에 저장된 전체 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+-------+ | Value | +-------+ | a | | b | | a | | a | | b | | a | | b | +-------+ 7 rows in set (0.00 sec)
4. CASE 문으로 'a' ↔ 'b' 값 스왑하기
이제 핵심인 UPDATE 쿼리입니다. CASE 문을 사용해 컬럼 값이 'a'이면 'b'로, 그 외의 경우('b')에는 'a'로 변경하도록 지정합니다.
mysql> update DemoTable set Value=case when Value='a' then 'b' else 'a' end; Query OK, 7 rows affected (0.17 sec) Rows matched: 7 Changed: 7 Warnings: 0
참고: 일반적으로 두 값을 맞바꿀 때는 임시 변수나 세 번째 값이 필요하지만, MySQL에서는 위처럼 CASE 문을 사용하면 단일 UPDATE 문으로도 안전하게 값을 교환할 수 있습니다. 이는 MySQL이 UPDATE 시 각 행의 기존 값을 먼저 읽은 후 새 값을 할당하기 때문입니다.
5. 변경 결과 확인
테이블을 다시 조회하면 모든 'a'는 'b'로, 'b'는 'a'로 바뀐 것을 확인할 수 있습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+-------+ | Value | +-------+ | b | | a | | b | | b | | a | | b | | a | +-------+ 7 rows in set (0.00 sec)
마무리
이처럼 MySQL에서는 CASE 문과 UPDATE 쿼리를 함께 사용하면 별도의 임시 테이블이나 추가 작업 없이도 열의 두 값을 한 번에 교환할 수 있습니다. 상태 플래그(예: Y/N, 0/1)를 반전시켜야 하는 상황에서 특히 유용하게 활용할 수 있으니 참고해 보시기 바랍니다.