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

MySQL REGEXP로 숫자로 끝나는 문자열 레코드 조회하기

MySQL에서 특정 컬럼의 값이 숫자로 끝나는 레코드만 조회하고 싶다면 REGEXP 연산자를 사용하면 됩니다. 정규 표현식 패턴 [[:digit:]]$를 활용하면 문자열의 마지막이 숫자(digit)인 행만 손쉽게 필터링할 수 있습니다.

기본 문법

SELECT * FROM yourTableName
WHERE yourColumnName REGEXP '[[:digit:]]$';

여기서 [[:digit:]]는 0부터 9까지의 숫자 한 글자를 의미하고, 끝에 붙는 $는 문자열의 끝을 나타냅니다. 즉, "문자열 마지막이 숫자로 종료되는" 조건이 됩니다.

예제 테이블 생성

실제 동작을 확인하기 위해 먼저 테스트용 테이블을 만들어 보겠습니다.

mysql> CREATE TABLE StringEndsWithNumber
    -> (
    -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> UserId varchar(20),
    -> UserName varchar(20)
    -> );
Query OK, 0 rows affected (0.62 sec)

샘플 데이터 입력

INSERT 명령으로 여러 개의 레코드를 추가합니다. 일부는 숫자로 시작하고, 일부는 숫자로 끝나도록 구성했습니다.

mysql> INSERT INTO StringEndsWithNumber(UserId,UserName) VALUES('123User','John');
Query OK, 1 row affected (0.18 sec)
mysql> INSERT INTO StringEndsWithNumber(UserId,UserName) VALUES('User456','Larry');
Query OK, 1 row affected (0.19 sec)
mysql> INSERT INTO StringEndsWithNumber(UserId,UserName) VALUES('User789','John');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO StringEndsWithNumber(UserId,UserName) VALUES('0981User','Carol');
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO StringEndsWithNumber(UserId,UserName) VALUES('User999','Bob');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO StringEndsWithNumber(UserId,UserName) VALUES('User1290','David');
Query OK, 1 row affected (0.37 sec)
mysql> INSERT INTO StringEndsWithNumber(UserId,UserName) VALUES('User456','James');
Query OK, 1 row affected (0.21 sec)

전체 데이터 확인

SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.

mysql> SELECT * FROM StringEndsWithNumber;

출력 결과

+----+----------+----------+
| Id | UserId   | UserName |
+----+----------+----------+
|  1 | 123User  | John     |
|  2 | User456  | Larry    |
|  3 | User789  | John     |
|  4 | 0981User | Carol    |
|  5 | User999  | Bob      |
|  6 | User1290 | David    |
|  7 | User456  | James    |
+----+----------+----------+
7 rows in set (0.00 sec)

숫자로 끝나는 문자열 조회 쿼리

이제 UserId가 숫자로 끝나는 레코드만 조회하는 실제 쿼리입니다.

mysql> SELECT * FROM StringEndsWithNumber
    WHERE UserId REGEXP '[[:digit:]]$';

출력 결과

+----+----------+----------+
| Id | UserId   | UserName |
+----+----------+----------+
|  2 | User456  | Larry    |
|  3 | User789  | John     |
|  5 | User999  | Bob      |
|  6 | User1290 | David    |
|  7 | User456  | James    |
+----+----------+----------+
5 rows in set (0.11 sec)

결과 분석

결과를 보면 User456, User789, User999, User1290처럼 끝자리가 숫자인 값만 반환된 것을 확인할 수 있습니다. 반면 123User0981User처럼 숫자로 시작하지만 알파벳으로 끝나는 값은 제외되었습니다.

참고 사항

  • 반대로 숫자로 시작하는 문자열을 찾으려면 패턴을 '^[[:digit:]]'로 변경하면 됩니다.
  • MySQL 8.0 이상에서는 POSIX 클래스 대신 '[0-9]$' 또는 '\\d$' 형태의 정규 표현식도 사용할 수 있습니다(ICU 라이브러리 기반).
  • REGEXP는 인덱스를 활용하지 못하는 경우가 많으므로, 대용량 테이블에서는 성능에 유의해야 합니다.