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

MySQL FIND_IN_SET() 함수로 쉼표로 구분된 값에서 일치하는 레코드 조회하기

쉼표로 구분된 값(예: '56,78,90,87')이 저장된 컬럼에서 특정 값과 일치하는 레코드를 조회하려면 MySQL의 FIND_IN_SET() 함수를 사용하면 됩니다. 이 함수는 문자열 목록 안에 찾고자 하는 값이 존재하는지 확인해 주며, WHERE 절과 함께 사용하면 원하는 레코드만 간단하게 추출할 수 있습니다.

1. 샘플 테이블 생성

먼저 학생 정보와 쉼표로 구분된 점수 목록을 저장할 테이블을 생성합니다.

mysql> create table DemoTable1548
    -> (
    -> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> StudentName varchar(20),
    -> ArrayListOfMarks varchar(100)
    -> );
Query OK, 0 rows affected (0.88 sec)

2. 테스트 데이터 삽입

INSERT 문을 사용해 몇 개의 레코드를 추가합니다.

mysql> insert into DemoTable1548(StudentName,ArrayListOfMarks) values('Chris','56,78,90,87');
Query OK, 1 row affected (0.29 sec)
mysql> insert into DemoTable1548(StudentName,ArrayListOfMarks) values('Bob','90,78,65');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable1548(StudentName,ArrayListOfMarks) values('David','91,34,56,78,87');
Query OK, 1 row affected (0.16 sec)

3. 전체 레코드 확인

SELECT 문으로 테이블에 저장된 모든 데이터를 조회합니다.

mysql> select * from DemoTable1548;

실행 결과는 다음과 같습니다.

+-----------+-------------+------------------+
| StudentId | StudentName | ArrayListOfMarks |
+-----------+-------------+------------------+
|        1 | Chris       |   56,78,90,87   |
|        2 | Bob         |     90,78,65    |
|        3 | David       | 91,34,56,78,87  |
+-----------+-------------+------------------+
3 rows in set (0.00 sec)

4. FIND_IN_SET()으로 특정 값 조회

이제 점수 목록에 '87'이 포함된 레코드만 조회하는 쿼리입니다.

mysql> select * from DemoTable1548 where find_in_set('87',ArrayListOfMarks);

실행 결과는 다음과 같습니다.

+-----------+-------------+------------------+
| StudentId | StudentName | ArrayListOfMarks |
+-----------+-------------+------------------+
|        1 | Chris       |   56,78,90,87   |
|        3 | David       | 91,34,56,78,87  |
+-----------+-------------+------------------+
2 rows in set (0.00 sec)

FIND_IN_SET() 동작 원리

FIND_IN_SET(찾을값, 대상문자열)은 대상 문자열을 쉼표 기준으로 분리한 뒤, 찾을 값이 몇 번째 위치에 있는지 반환합니다. 값이 존재하면 1 이상의 숫자를, 존재하지 않으면 0을 반환합니다. WHERE 절에서는 0이 아닌 값이 참으로 평가되기 때문에, 위 예제처럼 해당 값이 포함된 레코드만 정확하게 필터링됩니다.

다만 주의할 점은 LIKE '%87%' 방식과 달리 FIND_IN_SET()은 쉼표로 구분된 개별 값을 기준으로 비교하므로, '187'처럼 부분적으로 포함된 숫자까지 잘못 매칭되는 오류를 방지할 수 있다는 것입니다.