brunch

You can make anything
by writing

C.S.Lewis

by 갱그리 Jul 26. 2016

[Oracle] 쿼리에서 정규식 사용하기

7/26 개발일기

이번에 시스템을 새로 만들면서 기존에 있던 쿼리문을 수정해야 하는 일들이 많았다.

그러던 중 오늘은 이런 문제를 만났다.


SELECT *

FROM CommonDB.USER

WHERE USER_ID LIKE '%A%' 

OR USER_ID LIKE '%B%' 

OR USER_ID LIKE '%C%' 


예컨대 USER_ID 에 포함된 알파벳에 따라 특정한 레벨의 USER를 구분하고 있다고 가정했을 때, A~C 까지만 선택해야 하는 문제다. 그냥 풀어서 저렇게 쿼리 할 수도 있겠지만, 이게 별로 깔끔한 것 같지는 않아서 한 줄에 쉽게 표현할 수 있는 방법이 없는 지 찾아보다가 우연히 Query 에서 정규식을 사용할 수 있는 함수를 발견했다. 


regexp


오라클 10g 이상부터 지원되는 이 함수는 regexp_like, regexp_substr, 

regexp_instr, regexp_replace 등의 기능을 제공한다.


내가 사용한 건 regexp_like 다. 이 함수를 사용하면 위의 쿼리를 간단히 한 줄로 줄일 수 있다. 


SELECT *

FROM CommonDB.USER

WHERE regexp_like(USER_ID,'A|B|C')


나머지 기능들도 함수명과 매우 유사하다. regexp_like 가 like 함수를 확장 지원하는 형태였다면, regexp_instr 은 함수명에서 추론되는 대로 정규식으로 지정한 string의 위치를 반환한다.

regexp_substir 은 정규식으로 지정한 string을 반환하고, 

regexp_replace 는 정규식으로 지정한대로 문자열을 치환하여 리턴한다.


정규식 패턴은 우리가 jQuery 에서 사용하는 것과 같다. 찾아보니 표준 문법이라고 한다.


- [0-9] : 숫자 0에서 9까지

- ^a : a로 시작하는 경우

- a$ : a로 끝나는 경우

- a|b : a 또는 b가 포함되어 있는 경우

- a{n} : a가 n번 반복되는 경우 


더 많은 예제는 아래 위키를 참고하자.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari