쉼표로 구분된 문자열이 저장된 컬럼에서 특정 값이 포함된 행을 찾으려면 FIND_IN_SET() 함수를 사용하면 됩니다. 이 함수는 첫 번째 인수로 전달한 값이 두 번째 인수의 쉼표 구분 목록 안에 있으면 해당 위치(1부터 시작)를 반환하고, 없으면 0을 반환합니다.
예제 테이블 생성
먼저 테이블을 생성해 보겠습니다.
mysql> create table demo81
-> (
-> id int not null auto_increment primary key,
-> username varchar(200)
-> );
Query OK, 0 rows affected (1.44 sec)
데이터 삽입
INSERT 명령으로 쉼표로 구분된 사용자 이름 데이터를 여러 건 입력합니다.
mysql> insert into demo81(username) values('John,Chris,David');
Query OK, 1 row affected (0.11 sec)
mysql> insert into demo81(username) values('Mike,Sam');
Query OK, 1 row affected (0.14 sec)
mysql> insert into demo81(username) values('Chris,Bob,Sam');
Query OK, 1 row affected (0.13 sec)
mysql> insert into demo81(username) values('Mike,John,Chris');
Query OK, 1 row affected (0.23 sec)저장된 데이터 확인
SELECT 문으로 테이블의 전체 레코드를 조회합니다.
mysql> select *from demo81;
위 쿼리는 다음과 같은 결과를 출력합니다.
+----+------------------+
| id | username |
+----+------------------+
| 1 | John,Chris,David |
| 2 | Mike,Sam |
| 3 | Chris,Bob,Sam |
| 4 | Mike,John,Chris |
+----+------------------+
4 rows in set (0.00 sec)
FIND_IN_SET()으로 특정 값 조회
목록 문자열에서 'Chris'라는 값이 포함된 행만 선택하는 쿼리는 다음과 같습니다.
mysql> select *from demo81 where find_in_set('Chris',username) > 0;실행 결과는 아래와 같습니다.
+----+------------------+
| id | username |
+----+------------------+
| 1 | John,Chris,David |
| 3 | Chris,Bob,Sam |
| 4 | Mike,John,Chris |
+----+------------------+
3 rows in set (0.03 sec)
동작 원리 정리
find_in_set('Chris', username)은 username 컬럼의 값을 쉼표 기준으로 분리한 뒤 각 항목과 'Chris'를 비교합니다. 값이 발견되면 1 이상의 위치를 반환하고, 조건 > 0을 만족하는 행만 결과에 포함됩니다.
참고로 LIKE '%Chris%'를 사용할 수도 있지만, 이 경우 'Chris'가 다른 단어의 일부로 포함된 경우(예: 'Christopher')까지 함께 검색될 수 있습니다. 반면 FIND_IN_SET()은 쉼표로 구분된 항목 단위로 정확히 일치하는 값만 찾기 때문에 목록 형태의 데이터를 조회할 때 더 안전하고 정확한 방법입니다.