MySQL에서 특정 숫자가 포함된 모든 레코드 조회하기
쉼표로 구분된 값이 저장된 컬럼에서 특정 숫자가 포함된 모든 레코드를 조회하려면 concat() 함수와 LIKE 연산자를 함께 사용하면 됩니다.
기본 문법은 다음과 같습니다.
select * from yourTableName where concat(',', yourColumnName, ',') like '%,yourValue,%';핵심은 컬럼 값의 앞뒤에 쉼표를 붙여 검색 대상 숫자가 정확히 하나의 독립된 값으로 일치하는지 확인하는 것입니다. 이렇게 처리하면 '4'를 검색할 때 '14'나 '41'처럼 다른 숫자에 포함된 경우가 잘못 매칭되는 문제를 방지할 수 있습니다.
예제 테이블 생성
먼저 데모용 테이블을 만들어 보겠습니다.
mysql> create table demo49
-> (
-> id varchar(20),
-> first_name varchar(20)
-> );
Query OK, 0 rows affected (1.45 sec)
데이터 삽입
insert 명령어로 몇 개의 레코드를 추가합니다.
mysql> insert into demo49 values('4,5,6', 'Adam');
Query OK, 1 row affected (0.20 sec)
mysql> insert into demo49 values('5,3,2', 'Mike');
Query OK, 1 row affected (0.19 sec)
mysql> insert into demo49 values('3,4,9', 'Bob');
Query OK, 1 row affected (0.14 sec)저장된 데이터 확인
select 문으로 테이블의 전체 레코드를 조회합니다.
mysql> select *from demo49;
실행 결과는 다음과 같습니다.
+-------+------------+
| id | first_name |
+-------+------------+
| 4,5,6 | Adam |
| 5,3,2 | Mike |
| 3,4,9 | Bob |
+-------+------------+
3 rows in set (0.00 sec)
특정 숫자가 포함된 레코드 조회
이제 '4'라는 숫자가 포함된 모든 레코드를 조회하는 쿼리입니다.
mysql> select *from demo49 where concat(',', id, ',') like '%,4,%';실행 결과는 다음과 같습니다.
+-------+------------+
| id | first_name |
+-------+------------+
| 4,5,6 | Adam |
| 3,4,9 | Bob |
+-------+------------+
2 rows in set (0.00 sec)
'4'가 포함된 두 개의 레코드만 정확하게 반환된 것을 확인할 수 있습니다.
참고: FIND_IN_SET() 함수 활용
MySQL에서는 FIND_IN_SET() 함수를 사용해도 동일한 결과를 얻을 수 있으며, 코드가 더 간결하고 가독성이 좋다는 장점이 있습니다.
select * from demo49 where find_in_set('4', id) > 0;FIND_IN_SET은 쉼표로 구분된 문자열 목록에서 특정 값의 위치를 반환하므로, 값이 존재하는지 여부를 손쉽게 판단할 수 있습니다.
주의: 쉼표로 구분된 값을 하나의 컬럼에 저장하는 방식은 데이터베이스 정규화 원칙에 어긋나며 인덱스 활용에도 제약이 있습니다. 실무에서는 별도의 테이블로 분리하여 관계를 관리하는 것이 권장됩니다.