데이터베이스를 다루다 보면 하나의 컬럼에 쉼표(,)로 구분된 여러 값이 저장되어 있는 경우를 종종 마주하게 됩니다. 이럴 때 특정 값이 그 목록 안에 존재하는지 확인하려면 어떻게 해야 할까요? MySQL에서는 FIND_IN_SET() 함수를 사용하면 간단하게 해결할 수 있습니다.
FIND_IN_SET() 함수란?
FIND_IN_SET()은 첫 번째 인자로 전달한 값이 두 번째 인자의 쉼표 구분 문자열 목록 내에 있으면 해당 위치(1부터 시작)를 반환하고, 없으면 0을 반환합니다. 따라서 반환값이 0보다 큰지 비교하면 값의 존재 여부를 판별할 수 있습니다.
기본 문법
SELECT * FROM yourTablename WHERE FIND_IN_SET('yourValue', yourColumnName) > 0;실습 예제
먼저 테스트용 테이블을 생성해 보겠습니다.
mysql> create table existInCommaSeparatedList
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Name varchar(200)
-> );
Query OK, 0 rows affected (0.68 sec)다음으로 INSERT 명령을 사용해 쉼표로 구분된 이름 데이터를 몇 건 입력합니다.
mysql> insert into existInCommaSeparatedList(Name) values('John,Carol,Sam,Larry,Bob,David');
Query OK, 1 row affected (0.35 sec)
mysql> insert into existInCommaSeparatedList(Name) values('Maxwell,Chris,James');
Query OK, 1 row affected (0.14 sec)
mysql> insert into existInCommaSeparatedList(Name) values('Robert,Ramit');
Query OK, 1 row affected (0.34 sec)SELECT 문으로 테이블의 전체 데이터를 조회해 보겠습니다.
mysql> select *from existInCommaSeparatedList;
실행 결과는 다음과 같습니다.
+----+--------------------------------+ | Id | Name | +----+--------------------------------+ | 1 | John,Carol,Sam,Larry,Bob,David | | 2 | Maxwell,Chris,James | | 3 | Robert,Ramit | +----+--------------------------------+ 3 rows in set (0.00 sec)
값 존재 여부 확인하기
이제 쉼표 구분 목록에서 특정 값이 존재하는지 확인하는 실제 쿼리를 살펴보겠습니다. 여기서는 'Robert'라는 값이 포함된 행을 찾아보겠습니다.
mysql> SELECT *FROM existInCommaSeparatedList WHERE FIND_IN_SET('Robert',Name) > 0;'Robert'가 포함된 행만 정확히 조회되는 것을 확인할 수 있습니다.
+----+--------------+ | Id | Name | +----+--------------+ | 3 | Robert,Ramit | +----+--------------+ 1 row in set (0.00 sec)
주의 사항
FIND_IN_SET()은 정확한 일치 검색을 수행하므로 부분 문자열 매칭과는 다릅니다. 예를 들어 'Rob'으로 검색하면 'Robert'는 찾지 못합니다. 또한 이 함수는 인덱스를 활용할 수 없기 때문에 데이터 양이 많은 대용량 테이블에서는 성능 저하가 발생할 수 있습니다.
따라서 가능하다면 쉼표 구분 형태 대신 별도의 관계 테이블(정규화)로 데이터를 설계하는 것이 권장됩니다. 하지만 기존 시스템 유지보수나 간단한 조회 작업에는 FIND_IN_SET()이 매우 유용한 해결책입니다.