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

MySQL에서 쉼표로 구분된 목록 내 특정 값을 검색하는 방법 – FIND_IN_SET() 활용법

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()은 첫 번째 인자에 쉼표를 포함할 수 없으며, 대소문자를 구분하지 않습니다. 또한 데이터 양이 많은 경우 인덱스를 활용할 수 없어 성능이 저하될 수 있으므로, 대규모 데이터에서는 별도의 테이블로 정규화하는 것이 좋습니다.