MySQL에서 쉼표로 구분된 열 검색하기
데이터베이스를 운영하다 보면 하나의 열에 여러 값을 쉼표(,)로 구분해 저장하는 경우가 종종 있습니다. 이럴 때 특정 값이 포함된 행을 찾으려면 일반적인 LIKE 연산자 대신 FIND_IN_SET() 함수를 사용하는 것이 훨씬 정확하고 안전합니다.
FIND_IN_SET() 함수는 첫 번째 인수로 검색할 문자열을, 두 번째 인수로 쉼표로 구분된 문자열 목록을 받습니다. 해당 값이 목록에 존재하면 위치(인덱스)를 반환하고, 존재하지 않으면 0을 반환합니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable
-> (
-> Value varchar(20)
-> );
Query OK, 0 rows affected (0.47 sec)
2. 데이터 삽입하기
INSERT 명령을 사용해 테이블에 레코드를 추가합니다.
mysql> insert into DemoTable values('41,14,94');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values('64,84,94');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('44,74,103,104');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('904,1004,1444,1544');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('4,144,174');
Query OK, 1 row affected (0.15 sec)3. 저장된 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+--------------------+
| Value |
+--------------------+
| 41,14,94 |
| 64,84,94 |
| 44,74,103,104 |
| 904,1004,1444,1544 |
| 4,144,174 |
+--------------------+
5 rows in set (0.00 sec)
4. FIND_IN_SET()으로 값 검색하기
이제 쉼표로 구분된 열에서 '4'라는 값을 검색하는 쿼리를 실행해 보겠습니다.
mysql> select *from DemoTable where find_in_set('4',Value);실행 결과는 다음과 같습니다.
+-----------+
| Value |
+-----------+
| 4,144,174 |
+-----------+
1 row in set (0.00 sec)
결과 분석 및 주의 사항
위 결과를 보면 '4'가 포함된 행으로 '4,144,174' 하나만 반환되었습니다. 만약 LIKE '%4%'를 사용했다면 '41,14,94', '64,84,94', '44,74,103,104'처럼 숫자 중간에 4가 포함된 행까지 모두 잘못 검색되었을 것입니다. FIND_IN_SET()은 쉼표로 구분된 각 항목과 정확히 일치하는 값만 찾기 때문에 이러한 오류를 방지할 수 있습니다.
다만 FIND_IN_SET()에는 몇 가지 한계도 있습니다. 인덱스를 활용할 수 없어 대용량 데이터에서는 성능이 저하될 수 있으며, 문자열 기반 비교만 가능하다는 점을 유의해야 합니다. 따라서 실무에서는 정규화(Normalization)를 통해 별도의 테이블로 관계를 설계하는 것이 권장되지만, 기존 시스템 유지보수 등 부득이한 상황에서는 FIND_IN_SET()이 매우 유용한 해결책이 됩니다.