MySQL LOCATE(), POSITION(), INSTR() 함수의 공통점과 차이점
MySQL에서 LOCATE(), POSITION(), INSTR() 함수는 모두 하나의 문자열 안에서 특정 부분 문자열(substring)이 위치한 자리를 반환하는 데 사용됩니다. 세 함수는 기본적으로 동일한 역할을 수행하지만, LOCATE() 함수는 나머지 두 함수와 몇 가지 중요한 차이점을 가지고 있습니다.
1. 검색 시작 위치 지정 가능 여부
가장 큰 차이점은 LOCATE() 함수만 선택적 인수를 통해 검색을 시작할 위치를 지정할 수 있다는 점입니다. 반면 POSITION()과 INSTR() 함수는 시작 위치를 지정하는 인수를 제공하지 않기 때문에 항상 문자열의 맨 앞에서부터 검색을 수행합니다.
2. 문법(Syntax)의 차이
세 함수는 호출 방식에서도 서로 다른 문법 구조를 사용합니다.
-- LOCATE(): 시작 위치 인수 사용 가능
LOCATE(부분문자열, 문자열 [, 시작위치])
-- POSITION(): IN 키워드 방식
POSITION(부분문자열 IN 문자열)
-- INSTR(): 인수 순서가 LOCATE()와 반대
INSTR(문자열, 부분문자열)사용 예제
SELECT LOCATE('b', 'abcb'); -- 결과: 2
SELECT LOCATE('b', 'abcb', 3); -- 결과: 4 (3번째 위치부터 검색)
SELECT POSITION('b' IN 'abcb');-- 결과: 2
SELECT INSTR('abcb', 'b'); -- 결과: 2위 예제에서 볼 수 있듯이, LOCATE() 함수에 세 번째 인수로 시작 위치를 전달하면 해당 위치부터 검색이 진행되어 다른 결과를 얻을 수 있습니다. 또한 INSTR() 함수는 LOCATE()와 달리 문자열과 부분 문자열의 인수 순서가 반대라는 점도 주의해야 합니다.
정리
세 함수 모두 부분 문자열의 위치를 찾는 동일한 목적을 가지지만, 검색 시작 위치를 유연하게 조절해야 하는 경우에는 LOCATE() 함수가 가장 적합합니다. 단순히 첫 번째 등장 위치만 필요하다면 POSITION()이나 INSTR() 함수를 사용해도 무방합니다.