개요
MySQL에 저장된 문자열 데이터 끝에 "1stJohn (7)"처럼 괄호로 묶인 숫자가 붙어 있는 경우, 이를 제거하고 이름만 깔끔하게 남기고 싶을 때가 있습니다. 이럴 때 trim() 함수와 substring() 함수를 함께 사용하면 간단하게 해결할 수 있습니다.
예제 테이블 생성
먼저 실습에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
(
Name varchar(100)
);
Query OK, 0 rows affected (0.80 sec)
샘플 데이터 삽입
insert 명령을 사용하여 테이블에 샘플 레코드를 입력합니다. 괄호와 숫자가 붙은 값과 붙지 않은 값을 함께 넣어 비교해 보겠습니다.
mysql> insert into DemoTable values('1stJohn');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('1stJohn (7)');
Query OK, 1 row affected (0.65 sec)
mysql> insert into DemoTable values('2ndSam');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('2ndSam (4)');
Query OK, 1 row affected (0.15 sec)저장된 데이터 확인
select 문으로 테이블의 전체 레코드를 조회합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+-------------+
| Name |
+-------------+
| 1stJohn |
| 1stJohn (7) |
| 2ndSam |
| 2ndSam (4) |
+-------------+
4 rows in set (0.00 sec)
괄호로 묶인 후행 숫자 제거 쿼리
다음은 MySQL 열에서 괄호로 묶인 후행 숫자를 제거하는 쿼리입니다.
mysql> select trim(substring(Name, 1, (CHAR_LENGTH(Name) - LOCATE('(', REVERSE(Name))))) AS RemovingTrailingNumbers from DemoTable;위 쿼리를 실행하면 다음과 같이 괄호와 숫자가 제거된 결과를 확인할 수 있습니다.
+-------------------------+
| RemovingTrailingNumbers |
+-------------------------+
| 1stJohn |
| 1stJohn |
| 2ndSam |
| 2ndSam |
+-------------------------+
4 rows in set (0.00 sec)
쿼리 동작 원리
이 쿼리가 어떻게 동작하는지 단계별로 살펴보겠습니다.
- REVERSE(Name) : 문자열을 거꾸로 뒤집습니다.
- LOCATE('(', REVERSE(Name)) : 뒤집힌 문자열에서 여는 괄호의 위치를 찾아, 원본 문자열 기준으로 괄호 부분이 끝에서 얼마나 떨어져 있는지 계산합니다.
- CHAR_LENGTH(Name) - LOCATE(...) : 전체 길이에서 괄호 부분에 해당하는 길이를 빼면 이름 부분의 길이가 구해집니다.
- substring(Name, 1, 길이) : 문자열 처음부터 계산된 길이만큼 잘라냅니다.
- trim() : 잘라낸 결과의 불필요한 공백을 제거합니다.
참고로 괄호가 없는 일반 문자열(예: '1stJohn')에는 LOCATE()가 0을 반환하므로 전체 길이가 그대로 사용되어 원본 값이 변경되지 않고 유지됩니다. 이 방식을 활용하면 UPDATE 문과 결합하여 테이블의 데이터를 한 번에 정리하는 것도 가능합니다.