개요
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 절로 클라이언트 이름을 비교하여 단어 순서가 서로 다른 두 레코드를 모두 찾아냅니다. 이 방식은 이름 저장 시 순서가 일정하지 않은 데이터를 검색할 때 유용하게 활용할 수 있습니다.