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처럼 끝자리가 숫자인 값만 반환된 것을 확인할 수 있습니다. 반면 123User나 0981User처럼 숫자로 시작하지만 알파벳으로 끝나는 값은 제외되었습니다.
참고 사항
- 반대로 숫자로 시작하는 문자열을 찾으려면 패턴을
'^[[:digit:]]'로 변경하면 됩니다. - MySQL 8.0 이상에서는 POSIX 클래스 대신
'[0-9]$'또는'\\d$'형태의 정규 표현식도 사용할 수 있습니다(ICU 라이브러리 기반). REGEXP는 인덱스를 활용하지 못하는 경우가 많으므로, 대용량 테이블에서는 성능에 유의해야 합니다.