Oracle Replace() & Regexp_replace() 의 차이
오라클에서 정규식으로 처리해야 할 경우가 종종 있다. 예를 들자면 date 타입이 아니라 char 타입으로 박혀 있는 날짜 데이터라던가... 하던것들을 편집해야할 때가 있다. 예를 들자면 다음과 같다.
저런 형태로 char(19) 타입을 가진 컬럼이라고 한다면 가끔 순수한 숫자로만 나타내고 싶을 때가 있다. 내가 그런것이 아니라 누군가의 요청으로... 예를 들면 다음처럼 말이다.
이럴때 필요한 것은 보통 replace 함수를 떠올릴수도 있겠으나 지금 예시를 든것처럼 여러개의 문자를 동시에 치환을 하고 싶을 때가 있다. 그럴땐 regexp_replace 함수를 써보자. 그러나 우선적으로 replace와 regexp_replace의 차이점을 살펴보기 위해 replace 함수부터 보자.
replace 함수
기본적으로 replace도 간단한 문자열을 치환할 때는 간단하게 쓸 수 있어 좋다. 하지만 하나의 문자열에서 여러 가지의 문자를 치환하고 싶다면 보통은 다음처럼 SQL를 작성할 것이다.
select Replace(Replace(Replace('2014/10/01 00:00:00', ' ', ''), ':', ''), '/', '') from DUAL -- 20141001000000 값이 출력된다.
원하는 형태를 얻긴 했지만 SQL이 쓸데 없이 길어진 느낌이 든다. 이걸 한번에 처리할 수 없을까 고민했고 처리할 수 있는 방법을 찾았다.
regexp_replace 함수
일단 SQL를 보자. 개발자는 코드만 봐도 서로를 알 수 있다...가 사실일지는 아무도 모름.
select Regexp_Replace('2014/10/01 00:00:00', ' |:|/', '') from DUAL -- Replace와 마찬가지로 20141001000000 값이 출력된다.
깔끔하게 처리됐다. 파이프 기호|로 엮어서 여러가지 문자를 정규식 매칭을 통해 치환 처리할 수 있다. 위의 SQL에서는 공백 문자와 콜론: 문자, 그리고 슬래쉬/ 문자를 한번에 치환 처리한 것이다. REGEXP_REPLACE 함수에서 파이프 기호|가 의미하는것은 OR 연산이다. 연산자는 파이프 기호 외에도 많이 있으나 이번 포스팅에서는 OR 연산만 사용해봤다.
Closing Remarks
앞으로는 상황을 봐가며 REPLACE 함수와 REGEXP_REPLACE 함수를 적절하게 사용해보자. 다음 기회가 있다면 REGEXP_REPLACE의 자세한 사용법과 기능을 살펴보고자 한다.