티스토리 뷰

서 론

날짜형식의 데이터에 숫자만 들어가있어야 하는데 날짜형식에 부적합합니다. 하는 에러메세지
뿌리는 경우가 더러 - 아주 가끔 - 있다. 이  경우 범위를 잡아서 처리하면 좋긴하나, 중간의
어떤 문자중에 N개가 그러한 경우라면 찾기가 여간해서 쉽지 않다.
그러한 데이터를 찾아보고, 문제를 해결해본다.

본 론

9i 부터 Oracle 은 ANSI 표준 SQL을 지원하게 되었다.
아울러 regular expression 이 사용가능하게 되었는데,
이에 따라 몇가지 심플하면서도 강력한 기능이 가능하게 되었다.(내부적으로는 역시 펑션구현)

REGEXP_INSTR , REGEXP_LIKE, REGEXP_SUBSTR, REGEXP_REPLACE

위 네개의 펑션에 대해서 간단하게 알아본다.

1. regexp_like

 select * from (
 select '001a1' a from dual
 union all
 select '01111' a  from dual
 union all
 select 'aaxxk' a from dual
)
 WHERE NOT REGEXP_LIKE(a, '[^[:digit:]]');

숫자만으로 이루어진 값을 찾아내는데 사용된다.
즉, 01111만 리턴된다.

 WHERE REGEXP_LIKE(a, '[^[:digit:]]')

와 같이 주면 문자가 하나라도 들어가 있는 row가 리턴된다.

2. regexp_instr

select regexp_instr(
       'Joe Smith, 10045 Berry Lane, San Joseph, CA 91234',
       '[[:digit:]]{5}$')
  from dual


위와 같은 select 문에서는 45가 리턴된다.(해보라 -0- 백문이 불여일견)
5자리 숫자중 마지막에 위치하는 숫자를 리턴하기 때문이다.

3. regexp_replace

select regexp_replace('Joe   Smith','( ){2,}', ' ') from dual


( )안의 공백이 두개인 문자를 ' ' 한칸으로 replace한 결과를 리턴한다.



댓글
  • 프로필사진 얼음공주 블로그 구경잘 하였습니다. 블로그에 필요한 동영상, boom4u.net 도 구경 오세요~~ 2007.08.21 15:01
댓글쓰기 폼