MySQL에서 쉼표로 구분된 목록(comma-separated list)의 일부에 해당하는 레코드를 조회하려면 내장 함수인 FIND_IN_SET()을 사용하면 됩니다. 이 함수는 지정한 문자열이 쉼표로 구분된 목록 안에 존재하는지 확인하고, 존재할 경우 해당 위치(인덱스)를 반환합니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name varchar(20),
Marks varchar(200)
);
Query OK, 0 rows affected (0.61 sec)위 테이블은 학생의 이름(Name)과 쉼표로 구분된 점수 목록(Marks)을 저장하도록 설계되었습니다.
2. 샘플 데이터 삽입하기
INSERT 명령어를 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable(Name,Marks) values('Larry','98,34,56,89');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable(Name,Marks) values('Chris','67,87,92,99');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable(Name,Marks) values('Robert','33,45,69,92');
Query OK, 1 row affected (0.22 sec)3. 저장된 데이터 확인하기
SELECT 명령어로 테이블에 저장된 전체 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+----+--------+-------------+ | Id | Name | Marks | +----+--------+-------------+ | 1 | Larry | 98,34,56,89 | | 2 | Chris | 67,87,92,99 | | 3 | Robert | 33,45,69,92 | +----+--------+-------------+ 3 rows in set (0.00 sec)
4. FIND_IN_SET()으로 특정 값 검색하기
이제 쉼표로 구분된 목록에서 특정 값이 포함된 레코드를 조회해 보겠습니다. 여기서는 점수가 99인 학생의 기록을 찾아보겠습니다.
mysql> select Id,Name from DemoTable where find_in_set('99',Marks) > 0;FIND_IN_SET('99', Marks)는 Marks 컬럼의 값 중 '99'라는 항목이 있는지 확인하며, 값이 발견되면 0보다 큰 위치 값을 반환합니다. 따라서 WHERE 조건에 > 0을 넣으면 해당 값이 목록에 포함된 레코드만 필터링됩니다.
실행 결과는 다음과 같습니다.
+----+-------+ | Id | Name | +----+-------+ | 2 | Chris | +----+-------+ 1 row in set (0.00 sec)
결과를 보면 Marks 목록에 '99'가 포함된 Chris(Id: 2)만 정상적으로 조회된 것을 확인할 수 있습니다.
참고 사항
FIND_IN_SET()은 첫 번째 인자에 쉼표를 포함할 수 없으며, 대소문자를 구분하지 않습니다. 또한 데이터 양이 많은 경우 인덱스를 활용할 수 없어 성능이 저하될 수 있으므로, 대규모 데이터에서는 별도의 테이블로 정규화하는 것이 좋습니다.