쉼표(,)로 구분된 여러 숫자가 저장된 열에서 특정 숫자를 포함하는 행을 조회하려면 FIND_IN_SET() 함수를 사용해야 합니다. 이 함수는 쉼표로 구분된 문자열 목록 안에서 원하는 값의 위치를 찾아주며, 값이 존재하면 해당 위치를 반환하고 존재하지 않으면 0을 반환합니다.
1. 샘플 테이블 생성
먼저 예제에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable ( CustomerId int NOT NULL AUTO_INCREMENT PRIMARY KEY, CustomerName varchar(20), CustomerAllProductPrice text ); Query OK, 0 rows affected (0.30 sec)
2. 데이터 삽입
INSERT 명령어를 사용하여 몇 개의 레코드를 추가합니다. 이때 가격 정보는 쉼표로 구분된 형태로 저장합니다.
mysql> insert into DemoTable(CustomerName,CustomerAllProductPrice) values('Chris','245,345,678,90,45,56,78');
Query OK, 1 row affected (0.03 sec)
mysql> insert into DemoTable(CustomerName,CustomerAllProductPrice) values('Chris','98,99,90,56,77');
Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable(CustomerName,CustomerAllProductPrice) values('David','1000,2000,4000,56000');
Query OK, 1 row affected (0.06 sec)3. 전체 데이터 확인
SELECT 문을 사용하여 테이블의 모든 레코드를 조회합니다.
mysql> select *from DemoTable;
위 쿼리는 다음과 같은 결과를 출력합니다.
+------------+--------------+-------------------------+ | CustomerId | CustomerName | CustomerAllProductPrice | +------------+--------------+-------------------------+ | 1 | Chris | 245,345,678,90,45,56,78 | | 2 | Chris | 98,99,90,56,77 | | 3 | David | 1000,2000,4000,56000 | +------------+--------------+-------------------------+ 3 rows in set (0.00 sec)
4. FIND_IN_SET()으로 특정 숫자 검색하기
다음은 쉼표로 구분된 숫자 목록에서 '4000'이라는 값을 포함하는 행을 선택하는 쿼리입니다.
mysql> select *from DemoTable where find_in_set('4000',CustomerAllProductPrice);실행 결과는 다음과 같습니다.
+------------+--------------+-------------------------+ | CustomerId | CustomerName | CustomerAllProductPrice | +------------+--------------+-------------------------+ | 3 | David | 1000,2000,4000,56000 | +------------+--------------+-------------------------+ 1 row in set (0.14 sec)
참고 사항
FIND_IN_SET() 함수를 사용할 때 주의할 점이 있습니다. LIKE 연산자와 달리 FIND_IN_SET()은 쉼표로 구분된 각 항목을 정확히 일치하는지 비교합니다. 예를 들어 '400'을 검색하면 '4000'이나 '3400'에는 매칭되지 않습니다. 또한 이 함수는 인덱스를 활용할 수 없기 때문에 데이터 양이 많은 경우 성능 저하가 발생할 수 있으므로, 대용량 데이터에서는 별도의 관계형 테이블로 정규화하는 것이 권장됩니다.