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

MySQL FIND_IN_SET() 함수로 특정 숫자가 포함된 레코드 전체 조회하기

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()은 쉼표로 구분된 개별 값을 기준으로 정확히 일치하는 값만 찾아주므로 훨씬 안전합니다.
  • 인덱스 활용 불가: 쉼표로 구분된 값이 담긴 컬럼에는 일반적인 인덱스가 적용되지 않으므로, 데이터 양이 많다면 전체 테이블 스캔으로 인한 성능 저하가 발생할 수 있습니다. 대용량 서비스에서는 별도의 매핑 테이블(정규화) 설계를 권장합니다.