MySQL에서 특정 문자열에 숫자가 포함되어 있는지 확인하고 싶다면 REGEXP, 즉 정규 표현식(Regular Expression)을 활용하면 됩니다. 정규 표현식을 사용하면 복잡한 조건 처리 없이 간단한 쿼리 한 줄로 숫자 포함 여부를 판별할 수 있습니다.
기본 문법
문자열에 숫자가 포함되어 있는지 검사하는 기본 문법은 다음과 같습니다.
SELECT * FROM yourTableName WHERE yourColumnName REGEXP '[0-9]';
여기서 [0-9]는 0부터 9까지의 임의의 숫자 하나를 의미합니다. 따라서 해당 컬럼의 값 중 어느 위치든 숫자가 하나라도 들어 있으면 그 행이 조회 결과에 포함됩니다.
예제 테이블 생성
실제 동작을 이해하기 위해 예제용 테이블을 먼저 만들어 보겠습니다. 아래 쿼리로 StringContainsNumber 테이블을 생성합니다.
mysql> create table StringContainsNumber
-> (
-> Id int not null auto_increment,
-> Words text,
-> primary key(Id)
-> );
Query OK, 0 rows affected (0.53 sec)테스트 데이터 삽입
INSERT 명령으로 몇 개의 샘플 데이터를 넣어 보겠습니다. 일부러 숫자가 포함된 문자열과 포함되지 않은 문자열을 섞어서 입력했습니다.
mysql> insert into StringContainsNumber(Words) values('He12345llo');
Query OK, 1 row affected (0.19 sec)
mysql> insert into StringContainsNumber(Words) values('MySQL is not a programming 4language');
Query OK, 1 row affected (0.17 sec)
mysql> insert into StringContainsNumber(Words) values('Java is an object oriented');
Query OK, 1 row affected (0.18 sec)
mysql> insert into StringContainsNumber(Words) values('Java does not support 456 multiple inheritance');
Query OK, 1 row affected (0.20 sec)
mysql> insert into StringContainsNumber(Words) values('MySQL is a RDBMS 456');
Query OK, 1 row affected (0.19 sec)전체 데이터 조회
SELECT 문으로 테이블의 모든 레코드를 확인해 보겠습니다.
mysql> select *from StringContainsNumber;
실행 결과는 다음과 같습니다.
+----+------------------------------------------------+ | Id | Words | +----+------------------------------------------------+ | 1 | He12345llo | | 2 | MySQL is not a programming 4language | | 3 | Java is an object oriented | | 4 | Java does not support 456 multiple inheritance | | 5 | MySQL is a RDBMS 456 | +----+------------------------------------------------+ 5 rows in set (0.00 sec)
REGEXP로 숫자 포함 문자열 조회하기
이제 REGEXP를 사용해 숫자가 포함된 문자열만 골라내는 쿼리를 실행해 보겠습니다.
mysql> select *from StringContainsNumber where Words regexp '[0-9]';
결과는 다음과 같습니다.
+----+------------------------------------------------+ | Id | Words | +----+------------------------------------------------+ | 1 | He12345llo | | 2 | MySQL is not a programming 4language | | 4 | Java does not support 456 multiple inheritance | | 5 | MySQL is a RDBMS 456 | +----+------------------------------------------------+ 4 rows in set (0.11 sec)
결과 분석
출력 결과를 보면 전체 5개 레코드 중 4개만 반환되었습니다. Id가 3인 'Java is an object oriented'는 숫자를 포함하지 않기 때문에 결과에서 제외된 것입니다. 반면 'He12345llo'처럼 숫자가 문자열 중간에 섞여 있는 경우나, 'MySQL is a RDBMS 456'처럼 끝에 붙어 있는 경우 모두 정상적으로 감지되었습니다.
참고 사항
MySQL 8.0 이상에서는 REGEXP 연산자 대신 REGEXP_LIKE() 함수를 사용할 수도 있습니다. 예를 들어 SELECT * FROM StringContainsNumber WHERE REGEXP_LIKE(Words, '[0-9]');와 같이 작성하면 동일한 결과를 얻을 수 있습니다. 또한 숫자가 아닌 특정 패턴(예: 영문자, 특수문자)을 찾고 싶다면 정규 표현식 패턴 부분만 원하는 범위로 바꿔 주면 됩니다.