쉼표로 구분된 값(예: '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'처럼 부분적으로 포함된 숫자까지 잘못 매칭되는 오류를 방지할 수 있다는 것입니다.