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

MySQL FIND_IN_SET() 함수로 쉼표로 구분된 열에서 특정 숫자 검색하기

MySQL에서 쉼표로 구분된 값에서 특정 숫자 검색하기

네, 가능합니다. MySQL에서 제공하는 FIND_IN_SET() 함수를 사용하면 하나의 열에 쉼표(,)로 구분되어 저장된 여러 개의 숫자 중에서 원하는 값을 손쉽게 검색할 수 있습니다. 이 함수는 두 번째 인수로 전달된 쉼표 구분 문자열 목록에서 첫 번째 인수의 위치를 반환하며, 값이 존재하지 않으면 0을 반환합니다.

1단계: 테이블 생성

먼저 예제에 사용할 테이블을 만들어 보겠습니다.

mysql> create table DemoTable
(
    ListOfNumbers varchar(100)
);
Query OK, 0 rows affected (1.24 sec)

2단계: 레코드 삽입

INSERT 명령을 사용하여 쉼표로 구분된 숫자 데이터를 삽입합니다.

mysql> insert into DemoTable values('784,746,894,344');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('456,322,333,456');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('654,785,678,456');
Query OK, 1 row affected (0.47 sec)
mysql> insert into DemoTable values('123,676,847,785');
Query OK, 1 row affected (0.34 sec)

3단계: 전체 데이터 조회

SELECT 문으로 테이블에 저장된 모든 레코드를 확인합니다.

mysql> select *from DemoTable;

실행하면 다음과 같은 결과가 출력됩니다.

+-----------------+
| ListOfNumbers   |
+-----------------+
| 784,746,894,344 |
| 456,322,333,456 |
| 654,785,678,456 |
| 123,676,847,785 |
+-----------------+
4 rows in set (0.00 sec)

4단계: FIND_IN_SET()으로 특정 숫자 검색

이제 WHERE 절과 함께 FIND_IN_SET() 함수를 사용하여 '456'이라는 숫자가 포함된 레코드만 조회해 보겠습니다.

mysql> select *from DemoTable where find_in_set('456',ListOfNumbers);

'456'이 포함된 두 개의 행만 정확하게 필터링되어 출력됩니다.

+-----------------+
| ListOfNumbers   |
+-----------------+
| 456,322,333,456 |
| 654,785,678,456 |
+-----------------+
2 rows in set (0.28 sec)

FIND_IN_SET() 함수 핵심 정리

  • 반환값: 찾는 값이 목록에 있으면 1부터 시작하는 위치(인덱스)를, 없으면 0을 반환합니다.
  • 정확한 일치: LIKE '%456%'와 달리 부분 문자열이 아니라 쉼표로 구분된 요소 단위로 정확히 일치하는 값만 찾습니다. 예를 들어 '4567'이나 '1456'은 매칭되지 않습니다.
  • 성능 주의: FIND_IN_SET()은 인덱스를 활용할 수 없기 때문에 데이터 양이 많아지면 전체 테이블 스캔이 발생하여 성능이 크게 저하될 수 있습니다.
  • 대안: 정규화 관점에서 보면 쉼표 구분 형태보다는 별도의 매핑 테이블로 분리해 저장하고 조인(JOIN)으로 조회하는 것이 더 바람직한 설계입니다.

간단한 조회나 소규모 데이터라면 FIND_IN_SET()만으로도 충분하지만, 대용량 서비스에서는 데이터 구조를 정규화하는 것을 권장합니다.