MySQL에서는 REGEXP(정규 표현식)를 사용하여 쉼표로 구분된 값(CSV 형태)이 저장된 컬럼에서 원하는 값을 손쉽게 검색할 수 있습니다.
예를 들어, 쉼표로 구분된 여러 값 중 하나라도 90이 포함된 행만 조회하고 싶다면 정규 표현식을 활용하면 됩니다.
1. 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1447
-> (
-> Value varchar(100)
-> );
Query OK, 0 rows affected (0.58 sec)2. 샘플 데이터 삽입
INSERT 명령을 사용해 몇 개의 레코드를 입력합니다.
mysql> insert into DemoTable1447 values('19,58,90,56');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1447 values('56,89,99,100');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable1447 values('75,76,65,90');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable1447 values('101,54,57,59');
Query OK, 1 row affected (0.14 sec)3. 전체 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select * from DemoTable1447;
실행 결과는 다음과 같습니다.
+--------------+ | Value | +--------------+ | 19,58,90,56 | | 56,89,99,100 | | 75,76,65,90 | | 101,54,57,59 | +--------------+ 4 rows in set (0.00 sec)
4. REGEXP로 특정 값 조회하기
아래는 쉼표로 구분된 값에서 특정 값(여기서는 90)이 포함된 레코드만 가져오는 쿼리입니다.
mysql> select * from DemoTable1447 where Value regexp '(^|,)90($|,)';
실행 결과는 다음과 같습니다.
+-------------+ | Value | +-------------+ | 19,58,90,56 | | 75,76,65,90 | +-------------+ 2 rows in set (0.00 sec)
정규 표현식 해설
'(^|,)90($|,)' 패턴은 다음과 같은 의미를 가집니다.
(^|,) : 문자열의 시작(^) 또는 쉼표(,) 뒤에 위치90 : 찾고자 하는 값($|,) : 문자열의 끝($) 또는 쉼표(,) 앞에 위치
이 패턴 덕분에 '190'이나 '900'처럼 90이 다른 숫자의 일부로 포함된 경우는 제외되고, 독립적인 값으로 90이 존재하는 행만 정확하게 조회됩니다.