본문 바로가기

개발/오라클

오라클 - 정규표현식 함수 REGEXP_SUBSTR()

이번에는 오라클 정규표현식의 여러 함수 중 REGEXP_SUBSTR() 에 대한 복습이다.


SUBSTR 이 단순하게 인덱스를 지정해 문자열을 잘라냈다고 한다면 REGEXP_SUBSTR 은 정규식을 이용해

좀 더 다양한 방법, 다양한 패턴으로 문자열을 자르는 것이 가능하다.


예를 들자면 이메일 주소에서 아이디, 도메인을 잘라서 따로 표기해야 한다고 했을 때 

SUBSTR 은 뭐 @ 의 인덱스를 찾고 어쩌고 뭐하고 했을 것을 간단하게 아래와 같은 문장으로 처리할 수 있다.

SELECT	MEM_EMAIL
		, REGEXP_SUBSTR(MEM_EMAIL, '[^@]+', 1, 1) AS EMAIL_ID
        , REGEXP_SUBSTR(MEM_EMAIL, '[^@]+', 1, 2) AS EMAIL_DOMAIN
FROM	REG_EXP_TEST

그럼 위의 문법에 대해서 공부해 볼건데 다른 블로그 보면 포지션이니 맷치 뭐시깽이니 어려운 말 많이 써놨는데 

그런 건 됐고 외우기 쉽고 보기 쉽게 변환해서 공부해보자.


REGEXP_SUBSTR(COLUMN, [REG_EXP], [START_INDEX], [GROUP_INDEX])


COLUMN : 컬럼명을 지정한다. 위에선 MEM_EMAIL 컬럼을 대상으로 쿼리를 작성했다.

REG_EXP : 정규표현식을 작성한다.

START_INDEX : 해당 정규표현식을 검색할 문자열의 INDEX 를 지정한다. 

이메일이 aquamiz@tistory.com 이라고 한다면 1이면 a, 2라면 q부터 검색을 시작한다.

GROUP_INDEX : 해당 정규표현식으로 잘라진 그룹이 2개 이상이라면 INDEX 를 지정해 그룹을 선택할 수 있다.

위 예시의 정규식에서는 @ 로 시작하지 않는 것으로 잘라라! 라고 했으니 @ 에 걸려 aquamiz 와 tistory.com 의 두 그룹으로 나뉘어진다.


그렇다면 만약 위의 정규식에서 약간의 변경을 준 다음과 같은 정규식이 있다고 하면 결과는 어떻게 될까?

SELECT	MEM_EMAIL
		, REGEXP_SUBSTR(MEM_EMAIL, '[@]+', 1, 1) AS EMAIL_ID
        , REGEXP_SUBSTR(MEM_EMAIL, '[@]+', 1, 2) AS EMAIL_DOMAIN
FROM	REG_EXP_TEST

첫번째 문장인 REGEXP_SUBSTR(MEM_EMAIL, '[@]+', 1, 1) AS EMAIL_ID 는 당연히 @ 가 결과로 나올 것이고,

두번째 문장인 REGEXP_SUBSTR(MEM_EMAIL, '[@]+', 1, 2) AS EMAIL_DOMAIN 은 당연히 null 이 결과로 나온다.


왜 이렇게 되느냐면 @ 를 자르겠다고 했으니 1그룹에서는 당연히 @ 만 들어있을 것이고

@ 는 하나만 존재하니 당연히 2그룹은 존재 자체를 하지 않을 것이기 때문이다.