쉼표로 구분된 값 목록에서 특정 VARCHAR ID를 찾아야 할 때가 있습니다. 이럴 때 MySQL의 FIND_IN_SET() 함수를 활용하면 간단하게 해결할 수 있습니다. 먼저 예제에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable ( Id varchar(255) ); Query OK, 0 rows affected (0.51 sec)
insert 명령을 사용하여 테이블에 몇 개의 레코드를 삽입합니다.
mysql> insert into DemoTable values('10,100,1000');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable values('101,120,2');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('3,4,5');
Query OK, 1 row affected (0.11 sec)select 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+-------------+ | Id | +-------------+ | 10,100,1000 | | 101,120,2 | | 3,4,5 | +-------------+ 3 rows in set (0.00 sec)
FIND_IN_SET()으로 특정 ID 찾기
값 목록에서 원하는 ID를 검색하는 쿼리는 다음과 같습니다.
mysql> select *from DemoTable where find_in_set('2',Id);'2'라는 값이 포함된 행만 정확히 필터링되어 출력됩니다.
+-----------+ | Id | +-----------+ | 101,120,2 | +-----------+ 1 row in set (0.03 sec)
FIND_IN_SET() 함수의 동작 방식
FIND_IN_SET(검색값, 대상문자열) 형태로 사용하며, 검색값이 쉼표로 구분된 목록 안에 존재하면 해당 위치(1부터 시작)를 반환하고, 존재하지 않으면 0을 반환합니다. 위 예제에서 '101,120,2'에는 '2'가 세 번째 위치에 있으므로 3이 반환되어 WHERE 조건이 참이 됩니다.
참고로 LIKE '%2%'와 같은 단순 패턴 매칭은 '20', '200'처럼 2가 포함된 다른 값들까지 함께 검색될 수 있습니다. 반면 FIND_IN_SET()은 쉼표를 기준으로 값을 정확히 구분하기 때문에 오탐 없이 원하는 결과만 얻을 수 있다는 장점이 있습니다. 다만 데이터 양이 많아지면 인덱스를 활용할 수 없어 성능이 저하될 수 있으므로, 대량의 데이터를 다룬다면 별도의 테이블로 정규화하는 것이 바람직합니다.