MySQL에서 하이픈으로 연결된 문자열 순서 뒤집기
MySQL에는 문자열을 거꾸로 뒤집어 주는 내장 함수 REVERSE()가 있습니다. 하지만 하이픈(-)과 같은 구분자로 연결된 문자열에 이 함수를 그대로 적용하면 원하는 결과를 얻을 수 없습니다.
REVERSE() 함수의 한계
'AB-CD-EF'라는 문자열에 REVERSE() 함수를 적용해 보면 결과가 어떻게 나오는지 확인할 수 있습니다.
mysql> SELECT REVERSE('AB-CD-EF');
+---------------------+
| REVERSE('AB-CD-EF') |
+---------------------+
| FE-DC-BA |
+---------------------+
1 row in set (0.00 sec)출력 결과는 'FE-DC-BA'입니다. 구분자까지 포함해 문자열 전체가 단순히 좌우 반전되어 버렸습니다. 실제로 원하는 결과는 각 세그먼트의 순서만 바뀐 'EF-CD-AB'입니다.
SUBSTRING_INDEX()와 INSTR() 함수를 활용한 해결 방법
원하는 형태의 결과를 얻으려면 SUBSTRING_INDEX(), INSTR()(또는 LOCATE()), CONCAT() 함수를 조합해야 합니다. 다음 예제를 살펴보세요.
mysql> SELECT CONCAT(SUBSTRING_INDEX('AB-CD-EF','-',-1), '-',
SUBSTR('AB-CD-EF', INSTR('AB-CD-EF','-')+1, INSTR('AB-CD-EF','-')),
LEFT('AB-CD-EF', LOCATE('-','AB-CD-EF') - 1)) AS 'Reversed';
+-----------+
| Reversed |
+-----------+
| EF-CD-AB |
+-----------+
1 row in set (0.00 sec)이번에는 의도했던 대로 'EF-CD-AB'가 정상적으로 출력되었습니다.
쿼리의 동작 원리
- SUBSTRING_INDEX('AB-CD-EF', '-', -1) : 마지막 구분자를 기준으로 오른쪽에 있는 세그먼트 'EF'를 추출합니다.
- SUBSTR('AB-CD-EF', INSTR('AB-CD-EF','-')+1, INSTR('AB-CD-EF','-')) : 첫 번째 하이픈 바로 다음 위치부터 지정된 길이만큼 잘라내어 중간 세그먼트 'CD-'를 추출합니다.
- LEFT('AB-CD-EF', LOCATE('-','AB-CD-EF') - 1) : 첫 번째 하이픈 앞에 있는 세그먼트 'AB'를 추출합니다.
이렇게 추출한 세 부분을 CONCAT() 함수로 하이픈 구분자와 함께 이어 붙이면, 각 세그먼트의 순서가 뒤집힌 'EF-CD-AB'라는 최종 결과를 얻을 수 있습니다. 참고로 INSTR()과 LOCATE()는 모두 특정 문자열의 위치를 찾는 함수이므로 상황에 따라 서로 바꿔 사용할 수 있습니다.