Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 쉼표로 구분된 여러 ID가 있는 특정 행을 찾는 방법 – FIND_IN_SET() 완벽 가이드

MySQL에서 하나의 컬럼에 쉼표(,)로 구분된 여러 개의 ID가 저장되어 있을 때, 그중 특정 ID를 포함하는 행을 찾아야 하는 경우가 있습니다. 이럴 때 유용하게 사용할 수 있는 함수가 바로 FIND_IN_SET()입니다. 이 글에서는 실제 예제를 통해 FIND_IN_SET() 함수의 사용법을 단계별로 살펴보겠습니다.

1. 테이블 생성하기

먼저 쉼표로 구분된 ID 목록을 저장할 테이블을 생성합니다.

mysql> create table DemoTable
-> (
-> ListOfIds varchar(200)
-> );
Query OK, 0 rows affected (0.72 sec)

2. 샘플 데이터 삽입하기

INSERT 명령어를 사용하여 테이블에 레코드를 추가합니다. 각 행에는 쉼표로 구분된 여러 개의 ID가 문자열 형태로 들어가 있습니다.

mysql> insert into DemoTable values('100,2093,678,686');
Query OK, 1 row affected (0.12 sec)

mysql> insert into DemoTable values('0595,9585,4885,95959');
Query OK, 1 row affected (0.20 sec)

mysql> insert into DemoTable values('0059954,95986884,9059596,9005');
Query OK, 1 row affected (0.20 sec)

3. 전체 데이터 조회하기

SELECT 문을 사용하여 테이블에 저장된 모든 레코드를 확인합니다.

mysql> select *from DemoTable;

출력 결과

+-------------------------------+
| ListOfIds |
+-------------------------------+
| 100,2093,678,686 |
| 0595,9585,4885,95959 |
| 0059954,95986884,9059596,9005 |
+-------------------------------+
3 rows in set (0.00 sec)

4. FIND_IN_SET()으로 특정 행 검색하기

이제 핵심 단계입니다. FIND_IN_SET() 함수를 WHERE 절에 사용하면, 쉼표로 구분된 목록 안에서 원하는 값이 정확히 일치하는 위치에 있는지 확인할 수 있습니다. 아래 쿼리는 '9005'라는 ID를 포함하는 행을 찾습니다.

mysql> select *from DemoTable where FIND_IN_SET('9005', ListOfIds);

출력 결과

+-------------------------------+
| ListOfIds |
+-------------------------------+
| 0059954,95986884,9059596,9005 |
+-------------------------------+
1 row in set (0.00 sec)

위 출력 결과에서 볼 수 있듯이, '9005'를 포함하고 있는 세 번째 행만 정확하게 반환되었습니다.

FIND_IN_SET() 함수의 동작 원리

FIND_IN_SET(검색값, 대상문자열)은 두 개의 인자를 받습니다. 첫 번째 인자는 찾고자 하는 값이고, 두 번째 인자는 쉼표로 구분된 문자열입니다. 함수는 해당 값이 발견되면 목록 내의 위치 인덱스(1부터 시작)를 반환하고, 찾지 못하면 0을 반환합니다. 따라서 WHERE 절에서 조건이 참이 되려면 반환값이 0보다 커야 하며, 위 예제처럼 FIND_IN_SET() 자체를 조건으로 사용하면 일치하는 행만 필터링됩니다.

주의 사항 및 성능 팁

FIND_IN_SET()은 부분 문자열 매칭(LIKE '%9005%')과 달리 쉼표로 구분된 개별 값을 정확히 비교한다는 점에서 오류 가능성이 적습니다. 다만 다음과 같은 한계도 고려해야 합니다.

- 인덱스를 활용할 수 없음: FIND_IN_SET()은 함수 기반 검색이므로 인덱스가 있어도 풀 테이블 스캔이 발생하여 데이터 양이 많을 경우 성능이 저하될 수 있습니다.
- 정규화 권장: 데이터 규모가 크거나 검색 빈도가 높다면, 쉼표로 구분된 문자열 대신 별도의 관계 테이블(1:N 구조)로 설계하는 것이 더 효율적입니다.

간단한 조회나 소규모 데이터 처리에는 FIND_IN_SET()이 매우 편리한 해결책이므로, 상황에 맞게 활용하시기 바랍니다.