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

MySQL에서 쉼표로 구분된 값이 저장된 컬럼에서 특정 값 검색하기 – LIKE 연산자 완벽 가이드

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을 반환하므로 정확한 단일 값 매칭에 더욱 적합합니다. 다만 이 방식은 인덱스를 활용할 수 없어 대량의 데이터에서는 성능이 저하될 수 있다는 점을 유의해야 하며, 가능하다면 관계형 테이블 설계(정규화)로 데이터를 분리해 저장하는 것이 권장됩니다.