MySQL에서 하나의 필드에 저장된 쉼표(또는 다른 구분자)로 구분된 여러 값을 검색하려면 IN() 연산자 대신 FIND_IN_SET() 함수를 사용해야 합니다. IN()은 컬럼 값 자체가 목록의 항목과 정확히 일치하는지 비교할 뿐, 하나의 문자열 필드 내부에 포함된 개별 값을 찾지 못하기 때문입니다.
1. 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable -> ( -> ListOfValues text -> ); Query OK, 0 rows affected (0.56 sec)
2. 데이터 삽입
INSERT 명령을 사용하여 파이프(|)로 구분된 값을 가진 레코드를 삽입합니다.
mysql> insert into DemoTable values('10|20|30|40|50|60|100');
Query OK, 1 row affected (0.18 sec)3. 저장된 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+-----------------------+ | ListOfValues | +-----------------------+ | 10|20|30|40|50|60|100 | +-----------------------+ 1 row in set (0.00 sec)
4. FIND_IN_SET()으로 특정 값 검색
FIND_IN_SET() 함수는 쉼표(,)로 구분된 문자열 목록에서 특정 값의 위치를 반환합니다. 따라서 REPLACE() 함수를 함께 사용하여 먼저 파이프(|)를 쉼표(,)로 변환한 뒤 검색하면 됩니다.
mysql> select FIND_IN_SET(100, replace(ListOfValues,'|',',')) from DemoTable;
실행 결과는 다음과 같습니다.
+-------------------------------------------------+ | FIND_IN_SET(100, replace(ListOfValues,'|',',')) | +-------------------------------------------------+ | 7 | +-------------------------------------------------+ 1 row in set (0.04 sec)
결과 해석
반환된 값 7은 '100'이 목록에서 일곱 번째 위치에 있음을 의미합니다. 만약 검색하려는 값이 목록에 존재하지 않으면 FIND_IN_SET()은 0을 반환하므로, WHERE 절과 함께 사용하면 해당 값을 포함하는 행만 필터링할 수 있습니다.
mysql> select * from DemoTable
-> where FIND_IN_SET(100, replace(ListOfValues,'|',','));
참고로, 이 방식은 데이터 양이 많거나 인덱스가 필요한 경우 성능상 비효율적일 수 있습니다. 가능하다면 별도의 조인 테이블로 데이터를 정규화하는 것이 권장되지만, 간단한 조회나 임시 데이터 처리에는 FIND_IN_SET()이 매우 유용합니다.