MySQL에서 REGEXP 연산자를 사용하면 정규 표현식 기반으로 원하는 패턴과 일치하는 레코드를 손쉽게 조회할 수 있습니다. 이번 글에서는 'EMPLOYEE:100'처럼 특정 코드 뒤에 추가 숫자가 붙어 있거나 줄이 끝나는 경우 모두 일치시키는 방법을 알아보겠습니다.
1. 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable(EmployeeCode varchar(100)); Query OK, 0 rows affected (0.56 sec)
2. 샘플 데이터 삽입
INSERT 명령을 사용해 몇 개의 레코드를 입력합니다.
mysql> insert into DemoTable values('EMPLOYEE:100 John Smith');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('EMPLOYEE:16537 Chris Brown');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('EMPLOYEE:100 David Miller');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('EMPLOYEE:100 23432 David Miller');
Query OK, 1 row affected (0.20 sec)3. 전체 레코드 확인
SELECT 문으로 테이블의 모든 데이터를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+---------------------------------+ | EmployeeCode | +---------------------------------+ | EMPLOYEE:100 John Smith | | EMPLOYEE:16537 Chris Brown | | EMPLOYEE:100 David Miller | | EMPLOYEE:100 23432 David Miller | +---------------------------------+ 4 rows in set (0.00 sec)
4. REGEXP로 선택적 패턴 일치시키기
예를 들어 'EMPLOYEE:100 23432 David Miller'처럼 100 뒤에 '23432' 같은 추가 숫자가 있거나, 그냥 줄이 바로 끝나는 경우 모두 매칭하고 싶다면 아래 쿼리를 사용합니다.
mysql> select *from DemoTable where EmployeeCode REGEXP "EMPLOYEE:100([^0-9]|$)";
여기서 핵심은 정규 표현식 ([^0-9]|$) 부분입니다.
- [^0-9] : 숫자가 아닌 임의의 문자 하나와 일치합니다. 즉, 100 뒤에 공백이나 다른 문자가 오는 경우를 의미합니다.
- | : OR 조건으로, 앞의 패턴 또는 뒤의 패턴 중 하나와 일치하면 됩니다.
- $ : 문자열의 끝을 의미합니다. 즉, 100 뒤에 아무것도 없이 문자열이 종료되는 경우도 일치시킵니다.
만약 단순히 EMPLOYEE:100으로만 검색하면 'EMPLOYEE:1000' 같은 값까지 함께 걸릴 수 있습니다. 위와 같이 ([^0-9]|$)를 붙이면 100 뒤에 다른 숫자가 이어지는 경우는 제외되므로 훨씬 정확한 검색이 가능합니다.
실행 결과는 다음과 같습니다.
+---------------------------------+ | EmployeeCode | +---------------------------------+ | EMPLOYEE:100 John Smith | | EMPLOYEE:100 David Miller | | EMPLOYEE:100 23432 David Miller | +---------------------------------+ 3 rows in set (0.00 sec)
결과를 보면 'EMPLOYEE:100'으로 시작하는 세 개의 레코드가 정확히 조회된 것을 확인할 수 있습니다. 'EMPLOYEE:16537' 레코드는 제외되었고, 100 뒤에 추가 숫자가 붙은 'EMPLOYEE:100 23432 David Miller'는 정상적으로 포함되었습니다.
마무리
REGEXP의 문자 클래스와 앵커($)를 조합하면 특정 코드 뒤에 선택적으로 붙는 문자열이 있는 경우와 없는 경우를 모두 유연하게 처리할 수 있습니다. 비슷한 패턴 매칭이 필요할 때 ([^조건]|$) 형태를 응용해 보시기 바랍니다.