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 에서 정규식을 사용할 수 있는 함수를 발견했다.
오라클 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번 반복되는 경우
더 많은 예제는 아래 위키를 참고하자.