MySQL varchar 컬럼에서 숫자가 아닌 값만 선택하는 방법
MySQL에서 varchar 타입 컬럼에 저장된 데이터 중 숫자로만 구성된 값이 아니라 알파벳이 포함된 값만 추출하고 싶다면 REGEXP(정규 표현식) 연산자를 활용하면 됩니다. 기본 문법은 다음과 같습니다.
SELECT * FROM yourTableName WHERE yourColumnName REGEXP '[a-zA-Z]';
여기서 '[a-zA-Z]' 패턴은 영문 대소문자가 하나라도 포함된 행을 의미합니다. 따라서 '1000', '2456'처럼 숫자로만 이루어진 값은 자동으로 결과에서 제외됩니다.
예제 테이블 생성하기
개념을 쉽게 이해하기 위해 먼저 실습용 테이블을 생성해 보겠습니다. 테이블 생성 쿼리는 다음과 같습니다.
mysql> create table SelectNonNumericValue
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> UserId varchar(100)
-> );
Query OK, 0 rows affected (0.58 sec)
샘플 데이터 삽입하기
INSERT 명령으로 테이블에 레코드를 추가합니다. 숫자와 문자가 혼합된 값과 숫자로만 된 값을 함께 넣어 두 종류의 데이터 차이를 확인할 수 있도록 준비합니다.
mysql> insert into SelectNonNumericValue(UserId) values('123John');
Query OK, 1 row affected (0.12 sec)
mysql> insert into SelectNonNumericValue(UserId) values('58475Carol98457Taylor24');
Query OK, 1 row affected (0.52 sec)
mysql> insert into SelectNonNumericValue(UserId) values('199575Sam124');
Query OK, 1 row affected (0.14 sec)
mysql> insert into SelectNonNumericValue(UserId) values('Mike2456');
Query OK, 1 row affected (0.14 sec)
mysql> insert into SelectNonNumericValue(UserId) values('1000');
Query OK, 1 row affected (0.12 sec)
mysql> insert into SelectNonNumericValue(UserId) values('1001');
Query OK, 1 row affected (0.21 sec)
mysql> insert into SelectNonNumericValue(UserId) values('10293Bob');
Query OK, 1 row affected (0.13 sec)
mysql> insert into SelectNonNumericValue(UserId) values('David');
Query OK, 1 row affected (0.30 sec)
mysql> insert into SelectNonNumericValue(UserId) values('2456');
Query OK, 1 row affected (0.15 sec)전체 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from SelectNonNumericValue;
실행 결과는 다음과 같습니다. 총 9개의 행이 저장되어 있습니다.
+----+-------------------------+
| Id | UserId |
+----+-------------------------+
| 1 | 123John |
| 2 | 58475Carol98457Taylor24 |
| 3 | 199575Sam124 |
| 4 | Mike2456 |
| 5 | 1000 |
| 6 | 1001 |
| 7 | 10293Bob |
| 8 | David |
| 9 | 2456 |
+----+-------------------------+
9 rows in set (0.00 sec)
숫자가 아닌 값만 조회하는 쿼리 실행
이제 WHERE 절에 REGEXP 조건을 추가하여 영문자가 포함된 값, 즉 숫자가 아닌 값만 선택해 보겠습니다.
mysql> select *from SelectNonNumericValue WHERE UserId REGEXP '[a-zA-Z]';
아래 출력 결과를 보면 숫자로만 구성된 '1000', '1001', '2456' 세 개의 행은 제외되고, 나머지 6개 행만 정상적으로 반환된 것을 확인할 수 있습니다.
+----+-------------------------+
| Id | UserId |
+----+-------------------------+
| 1 | 123John |
| 2 | 58475Carol98457Taylor24 |
| 3 | 199575Sam124 |
| 4 | Mike2456 |
| 7 | 10293Bob |
| 8 | David |
+----+-------------------------+
6 rows in set (0.00 sec)
추가 팁: 반대로 숫자로만 된 값 조회하기
반대로 숫자로만 구성된 값만 조회하고 싶다면 NOT REGEXP를 사용하거나, REGEXP '^[0-9]+$' 패턴을 적용하면 됩니다. 이처럼 REGEXP를 잘 활용하면 복잡한 문자열 필터링도 간단한 쿼리 한 줄로 처리할 수 있습니다.