MySQL에서 하나의 컬럼에 '10,56,49484'처럼 쉼표로 구분된 여러 값이 저장되어 있을 때, 특정 값이 포함되어 있는지 검색해야 하는 경우가 종종 있습니다. 이럴 때는 LIKE 연산자를 활용하면 됩니다.
단순히 LIKE '%10%'로 검색하면 '110'이나 '210'처럼 원하지 않는 값까지 함께 조회될 수 있으므로, 값의 위치(맨 앞, 중간, 맨 뒤, 단독)에 따라 패턴을 나누어 처리하는 것이 핵심입니다.
1. 테스트용 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable675(Value text);
Query OK, 0 rows affected (0.55 sec)
2. 샘플 데이터 삽입
INSERT 명령으로 쉼표로 구분된 값들을 입력합니다.
mysql> insert into DemoTable675 values('10,56,49484,93993,211,4594');
Query OK, 1 row affected (0.28 sec)
mysql> insert into DemoTable675 values('4,7,1,10,90,23');
Query OK, 1 row affected (0.41 sec)
mysql> insert into DemoTable675 values('90,854,56,89,10');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable675 values('11,22,344,67,89');
Query OK, 1 row affected (0.10 sec)3. 전체 데이터 확인
SELECT 문으로 저장된 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable675;
실행 결과는 다음과 같습니다.
+----------------------------+
| Value |
+----------------------------+
| 10,56,49484,93993,211,4594 |
| 4,7,1,10,90,23 |
| 90,854,56,89,10 |
| 11,22,344,67,89 |
+----------------------------+
4 rows in set (0.00 sec)
4. 쉼표로 구분된 값 검색 쿼리
값 '10'이 정확히 일치하는 항목만 찾으려면 아래 네 가지 경우를 모두 고려해야 합니다.
- 맨 앞에 있는 경우:
LIKE '10,%' - 중간에 있는 경우:
LIKE '%,10,%' - 맨 뒤에 있는 경우:
LIKE '%,10' - 단독 값인 경우:
= '10'
이를 OR 조건으로 결합한 최종 쿼리는 다음과 같습니다.
mysql> select *from DemoTable675
WHERE Value LIKE '10,%'
OR Value LIKE '%,10'
OR Value LIKE '%,10,%'
OR Value = '10';
위 쿼리를 실행하면 '10'이 포함된 세 개의 행이 정확하게 조회됩니다.
+----------------------------+
| Value |
+----------------------------+
| 10,56,49484,93993,211,4594 |
| 4,7,1,10,90,23 |
| 90,854,56,89,10 |
+----------------------------+
3 rows in set (0.00 sec)
더 간결한 방법: FIND_IN_SET 함수
MySQL에서는 FIND_IN_SET() 함수를 사용하면 위의 복잡한 OR 조건 없이 한 줄로 동일한 결과를 얻을 수 있습니다.
mysql> select *from DemoTable675
WHERE FIND_IN_SET('10', Value) > 0;
FIND_IN_SET은 첫 번째 인수가 두 번째 인수(쉼표로 구분된 문자열) 목록 안에 있으면 해당 위치 인덱스를, 없으면 0을 반환하므로 정확한 단일 값 매칭에 더욱 적합합니다. 다만 이 방식은 인덱스를 활용할 수 없어 대량의 데이터에서는 성능이 저하될 수 있다는 점을 유의해야 하며, 가능하다면 관계형 테이블 설계(정규화)로 데이터를 분리해 저장하는 것이 권장됩니다.