데이터베이스 작업을 하다 보면 버전 정보처럼 마침표(.)와 숫자로 구성된 문자열만 골라내야 하는 경우가 있습니다. 이럴 때 MySQL의 REGEXP 연산자와 정규식 패턴을 활용하면 손쉽게 원하는 레코드만 필터링할 수 있습니다.
1. 샘플 테이블 생성
먼저 실습에 사용할 테이블을 생성하겠습니다. 버전 문자열을 저장할 Version 컬럼 하나로 구성된 간단한 테이블입니다.
mysql> create table DemoTable
-> (
-> Version varchar(20)
-> );
Query OK, 0 rows affected (0.77 sec)
2. 테스트 데이터 삽입
이제 INSERT 문을 사용해 몇 개의 레코드를 삽입합니다. 일부러 숫자 외의 문자가 포함된 값도 함께 넣어 정상적으로 필터링되는지 확인해 보겠습니다.
mysql> insert into DemoTable values('1.0.0');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable values('2.s6.9');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('1.5.0');
Query OK, 1 row affected (0.12 sec)3. 전체 데이터 확인
SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
위 쿼리는 아래와 같은 결과를 출력합니다.
+---------+
| Version |
+---------+
| 1.0.0 |
| 2.s6.9 |
| 1.5.0 |
+---------+
3 rows in set (0.00 sec)
결과를 보면 알파벳 's'가 섞여 있는 2.s6.9는 올바른 버전 형식이 아닙니다. 이제 정규식으로 이런 값을 제외해 보겠습니다.
4. REGEXP를 활용한 필터링 쿼리
다음은 마침표와 숫자로만 구성된 레코드를 조회하기 위해 REGEXP를 적용한 쿼리입니다.
mysql> select *from DemoTable
-> where Version regexp '^[0-9]+\.[0-9]+(\.[0-9]+)*';
쿼리 실행 결과는 다음과 같습니다.
+---------+
| Version |
+---------+
| 1.0.0 |
| 1.5.0 |
+---------+
2 rows in set (0.00 sec)
정규식 패턴 해석
^[0-9]+: 문자열이 반드시 숫자로 시작해야 함을 의미합니다.\.[0-9]+: 마침표 뒤에 최소 한 개 이상의 숫자가 이어져야 함을 의미합니다.(\.[0-9]+)*: '마침표 + 숫자' 조합이 0번 이상 반복될 수 있음을 의미합니다.
이 패턴 덕분에 1.0.0, 1.5.0처럼 숫자와 마침표만으로 된 값은 통과하고, 중간에 문자가 포함된 2.s6.9는 걸러지게 됩니다. 버전 번호 검증이나 로그 데이터 정제 등 다양한 상황에서 유용하게 활용할 수 있는 패턴이니 참고하시기 바랍니다.