MySQL에서 하나의 컬럼에 쉼표(,)로 구분된 여러 값이 저장되어 있을 때, 그중 특정 숫자가 포함된 레코드를 모두 조회하려면 FIND_IN_SET() 함수를 사용하면 됩니다.
FIND_IN_SET(str, strlist)는 첫 번째 인자로 찾고자 하는 문자열을, 두 번째 인자로 쉼표로 구분된 문자열 목록을 받습니다. 해당 값이 목록 안에 존재하면 그 위치(1부터 시작하는 인덱스)를 반환하고, 존재하지 않으면 0을 반환합니다. 따라서 결과값이 0보다 큰지를 조건으로 비교하면 원하는 레코드만 정확하게 필터링할 수 있습니다.
1. 예제 테이블 생성
먼저 실습에 사용할 테이블을 만들어 보겠습니다.
mysql> create table demo73
-> (
-> interest_id varchar(100),
-> interest_name varchar(100)
-> );
Query OK, 0 rows affected (1.48 sec)interest_id 컬럼에는 관심 항목 ID들이 쉼표로 구분된 형태로 저장됩니다.
2. 데이터 삽입
INSERT 문을 사용해 샘플 데이터를 입력합니다.
mysql> insert into demo73 values("100,101,103,105","SSC");
Query OK, 1 row affected (0.34 sec)
mysql> insert into demo73 values("105,103,1005,1003,104","Computer");
Query OK, 1 row affected (0.10 sec)
mysql> insert into demo73 values("110,105,104,111","Novel");
Query OK, 1 row affected (0.31 sec)3. 저장된 데이터 확인
SELECT 문으로 테이블의 전체 레코드를 조회합니다.
mysql> select *from demo73;
실행 결과는 다음과 같습니다.
출력 결과
+-----------------------+---------------+ | interest_id | interest_name | +-----------------------+---------------+ | 100,101,103,105 | SSC | | 105,103,1005,1003,104 | Computer | | 110,105,104,111 | Novel | +-----------------------+---------------+ 3 rows in set (0.00 sec)
4. 특정 숫자가 포함된 레코드 조회
이제 FIND_IN_SET()을 활용해 interest_id 컬럼에 "103"이라는 숫자가 포함된 레코드만 조회하는 쿼리를 작성해 보겠습니다.
mysql> select *from demo73 where find_in_set("103",interest_id) > 0;위 쿼리의 실행 결과는 다음과 같습니다.
출력 결과
+-----------------------+---------------+ | interest_id | interest_name | +-----------------------+---------------+ | 100,101,103,105 | SSC | | 105,103,1005,1003,104 | Computer | +-----------------------+---------------+ 2 rows in set (0.00 sec)
세 번째 레코드("110,105,104,111")에는 103이 없기 때문에 결과에서 제외되었고, 103을 포함한 두 개의 레코드만 정상적으로 반환된 것을 확인할 수 있습니다.
FIND_IN_SET() 사용 시 주의사항
- LIKE와의 차이:
LIKE '%103%'방식은 "1003", "1030"처럼 103이 부분 문자열로 들어간 값까지 함께 매칭될 수 있습니다. 반면FIND_IN_SET()은 쉼표로 구분된 개별 값을 기준으로 정확히 일치하는 값만 찾아주므로 훨씬 안전합니다. - 인덱스 활용 불가: 쉼표로 구분된 값이 담긴 컬럼에는 일반적인 인덱스가 적용되지 않으므로, 데이터 양이 많다면 전체 테이블 스캔으로 인한 성능 저하가 발생할 수 있습니다. 대용량 서비스에서는 별도의 매핑 테이블(정규화) 설계를 권장합니다.