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

MySQL FIND_IN_SET()로 사용자 정의 변수의 쉼표 구분 값 목록에서 특정 값 찾기

개요

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'처럼 공백 없이 작성해야 합니다.
  • 값 목록이 동적으로 변경되는 경우 사용자 정의 변수를 활용하면 쿼리 본문을 수정하지 않고도 조건을 유연하게 바꿀 수 있습니다.
  • 대량의 데이터를 다룰 때는 쉼표 구분 문자열 매칭 방식이 인덱스를 활용하기 어렵기 때문에 성능상 불리할 수 있습니다. 가능하다면 정규화된 별도의 테이블 설계를 고려하는 것이 좋습니다.