MySQL에서 REGEXP 연산자를 활용하면 하이픈(-)으로 구분된 숫자 형식의 데이터만 정확하게 필터링할 수 있습니다. 예를 들어 '100-677-9876'처럼 전화번호 형태로 저장된 값만 골라내고 싶을 때 유용합니다. 이번 글에서는 실제 예제를 통해 그 과정을 단계별로 살펴보겠습니다.
1. 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
(
Code varchar(100)
);
Query OK, 0 rows affected (1.16 sec)
2. 샘플 데이터 삽입
INSERT 명령을 사용하여 다양한 형식의 레코드를 삽입합니다. 순수한 숫자-하이픈 조합뿐 아니라 문자가 포함된 데이터도 함께 넣어 비교해 보겠습니다.
mysql> insert into DemoTable values('100-677-9876');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable values('100-677-9876-John');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('David-100-677-9876');
Query OK, 1 row affected (0.16 sec)3. 전체 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+--------------------+
| Code |
+--------------------+
| 100-677-9876 |
| 100-677-9876-John |
| David-100-677-9876 |
+--------------------+
3 rows in set (0.00 sec)
4. REGEXP로 하이픈 구분 숫자만 필터링
이제 하이픈으로 구분된 숫자만 표시하는 정규식 쿼리를 실행합니다.
mysql> select *from DemoTable where Code REGEXP '^\\(?[0-9]{3}\\)?[\\s-]?[0-9]{3}[\\s-]?[0-9]{4}$';결과는 다음과 같습니다.
+--------------+
| Code |
+--------------+
| 100-677-9876 |
+--------------+
1 row in set (0.00 sec)
정규식 패턴 해석
- ^ : 문자열의 시작을 의미합니다.
- \\(? : 여는 괄호 '(' 가 있을 수도 있고 없을 수도 있습니다.
- [0-9]{3} : 숫자 3자리가 연속으로 나타나야 합니다.
- \\)? : 닫는 괄호 ')' 가 있을 수도 있습니다.
- [\\s-]? : 공백 또는 하이픈이 있을 수도 있습니다.
- [0-9]{3}, [0-9]{4} : 각각 숫자 3자리와 4자리가 이어져야 합니다.
- $ : 문자열의 끝을 의미합니다.
정리
위 결과를 보면 '100-677-9876'처럼 숫자 3자리 - 숫자 3자리 - 숫자 4자리 형식을 완벽히 만족하는 데이터만 조회되었습니다. 앞이나 뒤에 문자가 붙은 '100-677-9876-John', 'David-100-677-9876' 같은 값은 ^와 $ 앵커 덕분에 제외됩니다. 이처럼 MySQL의 REGEXP 연산자를 사용하면 복잡한 형식 검증 조건도 간단한 하나의 WHERE 절로 처리할 수 있습니다.