Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL REGEXP로 특정 값 뒤에 오는 선택적 문자열까지 일치하는 레코드 조회하기

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의 문자 클래스와 앵커($)를 조합하면 특정 코드 뒤에 선택적으로 붙는 문자열이 있는 경우와 없는 경우를 모두 유연하게 처리할 수 있습니다. 비슷한 패턴 매칭이 필요할 때 ([^조건]|$) 형태를 응용해 보시기 바랍니다.