개요
MySQL에서 쉼표(,)로 구분된 값 집합 안에 특정 값이 포함되어 있는지 확인하려면 FIND_IN_SET() 함수를 사용하면 됩니다. 이 함수를 사용자 정의 변수와 함께 활용하면, 미리 선언해 둔 값 목록을 기준으로 테이블의 레코드를 손쉽게 필터링할 수 있습니다.
FIND_IN_SET()은 첫 번째 인수로 전달된 값이 두 번째 인수의 쉼표 구분 문자열에 존재하면 해당 위치(1부터 시작하는 인덱스)를 반환하고, 존재하지 않으면 0을 반환합니다. 따라서 WHERE 절에서 조건식으로 그대로 활용할 수 있습니다.
예제 테이블 생성
먼저 데모용 테이블을 생성합니다.
mysql> create table DemoTable1411
-> (
-> Value int
-> )
->;
Query OK, 0 rows affected (0.50 sec)
레코드 삽입
INSERT 문을 사용해 몇 개의 레코드를 삽입합니다.
mysql> insert into DemoTable1411 values(10);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1411 values(50);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1411 values(60);
Query OK, 1 row affected (0.08 sec)
전체 레코드 조회
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select * from DemoTable1411;
위 쿼리는 다음과 같은 결과를 출력합니다.
+-------+
| Value |
+-------+
| 10 |
| 50 |
| 60 |
+-------+
3 rows in set (0.00 sec)
FIND_IN_SET()과 사용자 정의 변수로 값 찾기
다른 값들의 집합에서 특정 값을 찾는 쿼리는 아래와 같습니다. 먼저 SET 문으로 사용자 정의 변수 @setOfValues에 쉼표로 구분된 값 목록을 할당한 뒤, 이 변수를 FIND_IN_SET() 메서드에 전달합니다.
mysql> set @setOfValues:='70,50,100';
Query OK, 0 rows affected (0.00 sec)
mysql> select * from DemoTable1411
-> where find_in_set(Value,@setOfValues);
위 쿼리는 다음과 같은 결과를 출력합니다.
+-------+
| Value |
+-------+
| 50 |
+-------+
1 row in set (0.00 sec)
결과 분석
변수 @setOfValues에는 '70,50,100'이라는 값 목록이 저장되어 있습니다. 테이블에는 10, 50, 60이라는 세 개의 값이 있으며, 이 중 50만 값 목록에 포함되어 있으므로 해당 레코드 하나만 조회된 것입니다.
참고 사항
- FIND_IN_SET()은 값 목록에 공백이 포함되면 정확하게 매칭되지 않으므로, '70,50,100'처럼 공백 없이 작성해야 합니다.
- 값 목록이 동적으로 변경되는 경우 사용자 정의 변수를 활용하면 쿼리 본문을 수정하지 않고도 조건을 유연하게 바꿀 수 있습니다.
- 대량의 데이터를 다룰 때는 쉼표 구분 문자열 매칭 방식이 인덱스를 활용하기 어렵기 때문에 성능상 불리할 수 있습니다. 가능하다면 정규화된 별도의 테이블 설계를 고려하는 것이 좋습니다.