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

MySQL REGEXP에서 괄호 이스케이프하기 – 괄호가 포함된 특정 값만 조회하는 방법

MySQL에서 REGEXP(정규 표현식)를 사용할 때 괄호 ()는 특수 문자로 해석되기 때문에, 문자 그대로의 괄호를 검색하려면 별도의 처리가 필요합니다. 이 글에서는 REGEXP 절에서 괄호를 올바르게 다루고, 괄호가 포함된 특정 패턴의 값만 조회하는 방법을 예제와 함께 살펴보겠습니다.

1. 예제 테이블 생성

먼저 실습에 사용할 테이블을 생성합니다.

mysql> create table DemoTable1908
    (
    Code text
    );
Query OK, 0 rows affected (0.00 sec)

2. 샘플 데이터 삽입

INSERT 명령을 사용해 몇 개의 레코드를 추가합니다. 괄호가 포함된 데이터와 포함되지 않은 데이터를 섞어서 넣습니다.

mysql> insert into DemoTable1908 values('MySQL(1)Database');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1908 values('MongoDB 2 Database');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1908 values('MySQL(3)Database');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1908 values('SQL Server(10)Database');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1908 values('MySQL 8 Database');
Query OK, 1 row affected (0.00 sec)

3. 전체 레코드 확인

SELECT 문으로 테이블의 모든 레코드를 조회합니다.

mysql> select * from DemoTable1908;

실행 결과는 다음과 같습니다.

+------------------------+
| Code                   |
+------------------------+
| MySQL(1)Database       |
| MongoDB 2 Database     |
| MySQL(3)Database       |
| SQL Server(10)Database |
| MySQL 8 Database       |
+------------------------+
5 rows in set (0.00 sec)

4. REGEXP에서 괄호 처리하기 – 핵심 기법

정규 표현식에서 괄호는 그룹화(grouping)를 의미하는 메타 문자입니다. 따라서 일반적인 방법으로는 문자 그대로의 괄호를 매칭할 수 없습니다.

여기서 유용한 방법은 대괄호([]) 문자 클래스 안에 괄호를 넣는 것입니다. 대괄호 안에 있는 문자는 특별한 의미 없이 리터럴(문자 그대로)로 취급되기 때문에, [(]은 여는 괄호 (, [)]는 닫는 괄호 )와 정확히 일치하게 됩니다.

다음은 'MySQL(숫자)Database' 형태, 즉 괄호로 묶인 값을 가진 행만 조회하는 쿼리입니다.

mysql> select * from DemoTable1908 where Code regexp '^MySQL[(][0-9][)]Database';

실행 결과는 다음과 같습니다.

+------------------+
| Code             |
+------------------+
| MySQL(1)Database |
| MySQL(3)Database |
+------------------+
2 rows in set (0.00 sec)

패턴 분석

  • ^MySQL : 문자열이 'MySQL'로 시작하는지 확인합니다.
  • [(] : 여는 괄호 '('를 문자 그대로 매칭합니다.
  • [0-9] : 숫자 한 자리(0~9)와 일치합니다.
  • [)] : 닫는 괄호 ')'를 문자 그대로 매칭합니다.
  • Database : 뒤따라 오는 'Database' 문자열과 일치합니다.

그 결과, 괄호가 없는 'MySQL 8 Database'나 숫자가 두 자리인 'SQL Server(10)Database'는 제외되고, 정확히 'MySQL(숫자)Database' 패턴에 해당하는 두 개의 행만 반환됩니다.

마무리

MySQL REGEXP에서 괄호 같은 특수 문자를 검색할 때는 백슬래시(\(, \))로 이스케이프하는 방법도 있지만, 대괄호 문자 클래스([(], [)])를 활용하면 더 간결하고 명확하게 표현할 수 있습니다. 두 방법 모두 결과는 동일하므로 상황에 맞게 선택해서 사용하시면 됩니다.