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

MySQL에서 쉼표로 구분된 문자열(SET 타입)에서 특정 단어 제거하는 방법

MySQL SET 타입에서 특정 단어 제거하기

MySQL의 SET 데이터 타입은 미리 정의된 여러 값을 쉼표로 구분된 형태로 하나의 컬럼에 저장할 수 있는 편리한 자료형입니다. 이번 글에서는 이렇게 저장된 문자열에서 특정 단어를 제거하는 방법을 실제 예제와 함께 단계별로 살펴보겠습니다.

1. 테이블 생성하기

먼저 SET 타입의 컬럼을 포함하는 테이블을 생성합니다.

mysql> create table DemoTable836(FirstName SET('John','Chris','Adam'));
Query OK, 0 rows affected (0.60 sec)

2. 데이터 삽입하기

INSERT 명령을 사용해 테스트용 레코드를 몇 개 추가합니다.

mysql> insert into DemoTable836 values('John,Chris');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable836 values('John,Chris,Adam');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable836 values('Chris,Adam');
Query OK, 1 row affected (0.25 sec)
mysql> insert into DemoTable836 values('John,Adam');
Query OK, 1 row affected (0.37 sec)

3. 저장된 데이터 확인하기

SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.

mysql> select *from DemoTable836;

실행 결과는 다음과 같습니다.

+-----------------+
| FirstName       |
+-----------------+
| John,Chris      |
| John,Chris,Adam |
| Chris,Adam      |
| John,Adam       |
+-----------------+
4 rows in set (0.00 sec)

4. 특정 단어 제거 쿼리 실행하기

다음은 쉼표로 구분된 문자열에서 특정 단어('Chris')를 제거하는 UPDATE 쿼리입니다.

mysql> update DemoTable836 set FirstName = FirstName &~ (1 << FIND_IN_SET('Chris', FirstName) - 1);
Query OK, 3 rows affected (0.21 sec)
Rows matched: 4 Changed: 3 Warnings: 0

쿼리 동작 원리를 간단히 정리하면 다음과 같습니다.

  • FIND_IN_SET('Chris', FirstName) : SET 값 안에서 'Chris'가 위치한 순서(1부터 시작)를 반환합니다.
  • - 1 : 반환값에서 1을 빼 0부터 시작하는 인덱스로 변환합니다.
  • 1 << 인덱스 : 해당 요소에 대응하는 비트 마스크를 생성합니다.
  • &~(AND NOT 연산) : 해당 비트를 0으로 초기화하여 SET에서 그 요소를 제거합니다.

5. 최종 결과 확인하기

테이블의 레코드를 다시 한 번 조회해 보겠습니다.

mysql> select *from DemoTable836;

실행 결과는 다음과 같습니다.

+-----------+
| FirstName |
+-----------+
| John      |
| John,Adam |
| Adam      |
| John,Adam |
+-----------+
4 rows in set (0.00 sec)

'Chris'가 포함되어 있던 모든 행에서 해당 단어가 깔끔하게 제거된 것을 확인할 수 있습니다. 반면 처음부터 'Chris'가 없었던 마지막 행(John,Adam)은 변경되지 않고 그대로 유지됩니다. 이처럼 FIND_IN_SET 함수와 비트 연산을 조합하면 별도의 문자열 처리 로직 없이도 SET 타입 컬럼에서 특정 요소를 간단하고 효율적으로 삭제할 수 있습니다.