MySQL에서 쉼표로 구분된 값에서 특정 숫자 검색하기
네, 가능합니다. MySQL에서 제공하는 FIND_IN_SET() 함수를 사용하면 하나의 열에 쉼표(,)로 구분되어 저장된 여러 개의 숫자 중에서 원하는 값을 손쉽게 검색할 수 있습니다. 이 함수는 두 번째 인수로 전달된 쉼표 구분 문자열 목록에서 첫 번째 인수의 위치를 반환하며, 값이 존재하지 않으면 0을 반환합니다.
1단계: 테이블 생성
먼저 예제에 사용할 테이블을 만들어 보겠습니다.
mysql> create table DemoTable
(
ListOfNumbers varchar(100)
);
Query OK, 0 rows affected (1.24 sec)
2단계: 레코드 삽입
INSERT 명령을 사용하여 쉼표로 구분된 숫자 데이터를 삽입합니다.
mysql> insert into DemoTable values('784,746,894,344');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('456,322,333,456');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('654,785,678,456');
Query OK, 1 row affected (0.47 sec)
mysql> insert into DemoTable values('123,676,847,785');
Query OK, 1 row affected (0.34 sec)
3단계: 전체 데이터 조회
SELECT 문으로 테이블에 저장된 모든 레코드를 확인합니다.
mysql> select *from DemoTable;
실행하면 다음과 같은 결과가 출력됩니다.
+-----------------+ | ListOfNumbers | +-----------------+ | 784,746,894,344 | | 456,322,333,456 | | 654,785,678,456 | | 123,676,847,785 | +-----------------+ 4 rows in set (0.00 sec)
4단계: FIND_IN_SET()으로 특정 숫자 검색
이제 WHERE 절과 함께 FIND_IN_SET() 함수를 사용하여 '456'이라는 숫자가 포함된 레코드만 조회해 보겠습니다.
mysql> select *from DemoTable where find_in_set('456',ListOfNumbers);
'456'이 포함된 두 개의 행만 정확하게 필터링되어 출력됩니다.
+-----------------+ | ListOfNumbers | +-----------------+ | 456,322,333,456 | | 654,785,678,456 | +-----------------+ 2 rows in set (0.28 sec)
FIND_IN_SET() 함수 핵심 정리
- 반환값: 찾는 값이 목록에 있으면 1부터 시작하는 위치(인덱스)를, 없으면 0을 반환합니다.
- 정확한 일치: LIKE '%456%'와 달리 부분 문자열이 아니라 쉼표로 구분된 요소 단위로 정확히 일치하는 값만 찾습니다. 예를 들어 '4567'이나 '1456'은 매칭되지 않습니다.
- 성능 주의: FIND_IN_SET()은 인덱스를 활용할 수 없기 때문에 데이터 양이 많아지면 전체 테이블 스캔이 발생하여 성능이 크게 저하될 수 있습니다.
- 대안: 정규화 관점에서 보면 쉼표 구분 형태보다는 별도의 매핑 테이블로 분리해 저장하고 조인(JOIN)으로 조회하는 것이 더 바람직한 설계입니다.
간단한 조회나 소규모 데이터라면 FIND_IN_SET()만으로도 충분하지만, 대용량 서비스에서는 데이터 구조를 정규화하는 것을 권장합니다.