MySQL에서 쉼표로 구분된 값에서 특정 값 찾기
MySQL에서 하나의 열에 78,89,65처럼 쉼표로 구분된 여러 값이 저장되어 있을 때, 그 안에서 특정 값을 포함하는 레코드를 찾으려면 FIND_IN_SET() 함수를 사용하면 됩니다.
FIND_IN_SET(찾을값, 대상문자열) 형태로 사용하며, 첫 번째 인자가 두 번째 인자의 쉼표 구분 목록 안에 존재하면 해당 위치를 반환하고, 존재하지 않으면 0을 반환합니다.
실제 예제를 통해 단계별로 살펴보겠습니다.
1단계: 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> ListOfValue varchar(20)
-> );
Query OK, 0 rows affected (0.52 sec)
2단계: 데이터 삽입
INSERT 명령어를 사용해 쉼표로 구분된 값들을 테이블에 입력합니다.
mysql> insert into DemoTable values('78,89,65');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('88,96,97');
Query OK, 1 row affected (0.30 sec)
mysql> insert into DemoTable values('95,96,99,100');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('78,45,67,98');
Query OK, 1 row affected (0.10 sec)3단계: 전체 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select * from DemoTable;
실행 결과는 다음과 같습니다.
+--------------+
| ListOfValue |
+--------------+
| 78,89,65 |
| 88,96,97 |
| 95,96,99,100 |
| 78,45,67,98 |
+--------------+
4 rows in set (0.00 sec)
4단계: FIND_IN_SET()으로 특정 레코드 검색
이제 FIND_IN_SET()과 OR 조건을 조합하여 '89' 또는 '99'라는 값을 포함하는 레코드만 조회해 보겠습니다.
mysql> select * from DemoTable
-> where find_in_set('89',ListOfValue)
-> or
-> find_in_set('99',ListOfValue);
실행 결과는 다음과 같습니다.
+--------------+
| ListOfValue |
+--------------+
| 78,89,65 |
| 95,96,99,100 |
+--------------+
2 rows in set (0.00 sec)
FIND_IN_SET() 사용 시 주의할 점
- LIKE와의 차이: LIKE '%89%'를 사용하면 '189'나 '890'처럼 다른 숫자의 일부까지 매칭될 수 있지만, FIND_IN_SET()은 쉼표로 구분된 개별 값 단위로 정확하게 비교합니다.
- 인덱스 활용 불가: FIND_IN_SET()은 열 전체를 스캔하므로 인덱스를 사용할 수 없습니다. 데이터 양이 많다면 성능 저하가 발생할 수 있습니다.
- 정규화 권장: 근본적으로는 이런 구조보다 별도의 자식 테이블로 정규화하여 각 값을 행 단위로 저장하는 것이 더 좋은 설계 방식입니다.
이처럼 FIND_IN_SET() 함수를 활용하면 쉼표로 구분된 값이 저장된 열에서도 원하는 레코드를 손쉽게 검색할 수 있습니다.