Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL FIND_IN_SET() 함수로 쉼표 구분 목록에서 값 존재 여부 확인하는 방법

데이터베이스를 다루다 보면 하나의 컬럼에 쉼표(,)로 구분된 여러 값이 저장되어 있는 경우를 종종 마주하게 됩니다. 이럴 때 특정 값이 그 목록 안에 존재하는지 확인하려면 어떻게 해야 할까요? 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()이 매우 유용한 해결책입니다.