MySQL에서 하나의 컬럼에 쉼표(,)로 구분된 여러 값이 저장되어 있을 때, 그중 특정 값이 포함되어 있는지 확인하려면 FIND_IN_SET() 함수를 사용하면 됩니다. 이번 글에서는 실제 예제를 통해 쉼표로 구분된 목록에서 원하는 값을 일치시키는 방법을 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
(
`Values` varchar(50)
);
Query OK, 0 rows affected (1.15 sec)2. 샘플 데이터 삽입하기
INSERT 명령을 사용하여 쉼표로 구분된 형태의 데이터를 몇 개 삽입합니다.
mysql> insert into DemoTable values('23,45,78,56');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('384,476,7456');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('68,8,88,89');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('78,80,84');
Query OK, 1 row affected (0.19 sec)3. 전체 데이터 확인하기
SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+--------------+ | Values | +--------------+ | 23,45,78,56 | | 384,476,7456 | | 68,8,88,89 | | 78,80,84 | +--------------+ 4 rows in set (0.00 sec)
4. FIND_IN_SET으로 특정 값 일치시키기
이제 FIND_IN_SET() 함수를 사용하여 쉼표로 구분된 목록 안에서 특정 값('8')을 찾는 쿼리를 실행해 보겠습니다.
mysql> select *from DemoTable where find_in_set('8',`Values`)!=0;실행 결과는 다음과 같습니다.
+------------+ | Values | +------------+ | 68,8,88,89 | +------------+ 1 row in set (0.00 sec)
FIND_IN_SET 함수의 동작 원리
FIND_IN_SET(찾을값, 대상문자열)은 대상 문자열을 쉼표 기준으로 분리한 뒤, 각 항목과 정확히 일치하는 값이 있는지 확인합니다.
- 값을 찾으면 해당 항목의 위치(인덱스)를 반환합니다. (1부터 시작)
- 값이 없으면 0을 반환합니다.
- 인수 중 하나가 NULL이면 NULL을 반환합니다.
따라서 위 예제에서 '8'은 '68,8,88,89'의 두 번째 항목과 정확히 일치하기 때문에 해당 행만 조회된 것입니다. 만약 LIKE '%8%'로 검색했다면 '384,476,7456'처럼 숫자 중간에 8이 포함된 행까지 함께 반환되어 잘못된 결과가 나올 수 있습니다. 이것이 FIND_IN_SET을 사용하는 핵심 이유입니다.
참고: FIND_IN_SET은 쉼표로 구분된 문자열 내에서만 동작하며, 공백이 포함된 경우 정확히 일치하지 않을 수 있습니다. 또한 대량의 데이터에서는 인덱스를 활용할 수 없어 성능이 떨어질 수 있으므로, 가능하다면 별도의 매핑 테이블(정규화) 설계를 권장합니다.