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

단일 MySQL 쿼리로 'Jone Deo' 또는 'Deo Jone' 레코드 조회하는 방법

개요

MySQL에서 이름의 단어 순서와 상관없이 'Jone Deo' 또는 'Deo Jone' 같은 레코드를 한 번의 쿼리로 조회해야 할 때가 있습니다. 이런 경우 LIKE 절SUBSTRING_INDEX() 함수를 조합하면 손쉽게 해결할 수 있습니다.

1단계: 테이블 생성

먼저 예제에 사용할 테이블을 만들어 보겠습니다.

mysql> create table DemoTable
    -> (
    -> ClientName varchar(100)
    -> );
Query OK, 0 rows affected (0.85 sec)

2단계: 레코드 삽입

insert 명령을 사용해 테이블에 샘플 데이터를 입력합니다.

mysql> insert into DemoTable values('John Smith');
Query OK, 1 row affected (0.15 sec)

mysql> insert into DemoTable values('Smith John');
Query OK, 1 row affected (0.18 sec)

mysql> insert into DemoTable values('Jone Deo');
Query OK, 1 row affected (0.17 sec)

mysql> insert into DemoTable values('Deo Jone');
Query OK, 1 row affected (0.14 sec)

mysql> insert into DemoTable values('Chris Brown');
Query OK, 1 row affected (0.15 sec)

3단계: 전체 레코드 확인

select 문으로 테이블에 저장된 모든 레코드를 확인합니다.

mysql> select *from DemoTable;

출력 결과

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

+-------------+
| ClientName  |
+-------------+
| John Smith  |
| Smith John  |
| Jone Deo    |
| Deo Jone    |
| Chris Brown |
+-------------+
5 rows in set (0.00 sec)

'Jone Deo' 또는 'Deo Jone' 레코드 조회 쿼리

아래는 단일 MySQL 쿼리로 'Jone Deo' 또는 'Deo Jone' 레코드를 조회하는 방법입니다.

mysql> select *from DemoTable
-> where ClientName
-> LIKE
-> (SELECT SUBSTRING_INDEX("%Jone% %Deo%", " ", -1))
-> or
-> (SELECT SUBSTRING_INDEX("%Deo% %Jone%", " ", 1));

출력 결과

쿼리를 실행하면 원하는 두 개의 레코드만 정확히 반환됩니다.

+------------+
| ClientName |
+------------+
| Jone Deo   |
| Deo Jone   |
+------------+
2 rows in set (0.00 sec)

쿼리 동작 원리

SUBSTRING_INDEX(문자열, 구분자, 위치) 함수는 지정한 구분자를 기준으로 문자열을 분리한 뒤, 위치 값이 양수이면 앞에서부터, 음수이면 뒤에서부터 해당 부분을 반환합니다. 위 쿼리에서는 와일드카드(%)가 포함된 패턴에서 공백을 기준으로 필요한 검색 패턴을 추출한 후, LIKE 절로 클라이언트 이름을 비교하여 단어 순서가 서로 다른 두 레코드를 모두 찾아냅니다. 이 방식은 이름 저장 시 순서가 일정하지 않은 데이터를 검색할 때 유용하게 활용할 수 있습니다.