본문 바로가기
oracle/[SQL] SQL

3장. 정규식함수

by #moonyz 2014. 9. 30.

정규식함수로 다양한 조건 조회


- 정규식

 ^

 해당 문자로 시작하는 line 출력

 $ 

 해당 문자로 끝나는 line 출력 

 . 

 apple -> a...p : a로 시작하여 p로 끝나는 line ( . -> 1character) 

 * 

 모든 이라는 뜻. 글자수가 0일수도 있음. 

 [ ] 

 해당 문자에 해당하는 한 문자 

 [^] 

 해당 문자에 해당하지 않는 한 문자 



[:문자클래스:]

alpha : 모든 알파벳

blank : 공백

cntrl

digit : 숫자

graph

lower : 소문자

print

space

upper : 대문자

xdigit



- REGEXP_LIKE : 특정 패턴과 매칭되는 결과를 검색

EX1. 영문자가 들어가 있는 행만 출력

regexp_like(text, '[a-z]') --소문자

regexp_like(text, '[A-Z]') --대문자

regexp_like(text, '[a-zA-Z]') --소문자, 대문자


EX2. 소문자로 시작하고 공백을 포함하는 경우

regexp_like(text, '[a-z] ') --소문자로 시작하고, 공백이 있는행

regexp_like(text, '[a-z]  [0-9]') --소문자로 시작 + 공백1칸 포함 + 숫자로 끝나는 행

regexp_like(text, '[[:space;]]') --공백이 있는 데이터를 모두 찾음.


EX3. 연속적인 글자 수 지정 

regexp_like(text, '[A-Z]{2}') --대문자가 연속으로 2글자 오는 경우

regexp_like(text, '[a-z]{3}') --소문자가 연속으로 3글자 오는 경우

regexp_like(text, '[A-Z][0-9]{3}') -- 대문자와 숫자가 각각 3글자씩 오는 경우

regexp_like(text, '[[:upper:]]') --대문자가 들어가는 모든행. regexp_like(text, '[A-Z]')


EX4. 특정 위치를 지정하여 출력 ( 시작하는 문자지정 : ^ / 끝나는 문자지정 : $ )

regexp_like(text, '^[A-Za-z]') -- 대문자나 소문자로 시작하는 행을 모두 출력

regexp_like(text, '^[a-z]|^[0-9]')  --소문자로 시작하거나 숫자로 시작하는 행 출력

regexp_like(text, '^s(a|t)') --s로 시작하고 두번째 글짜가 a나 t가 오는 행 출력

regexp_like(text, '[[:alpha:]]$') --영어로 끝나는 모든행. regexp_like(text, '[a-zA-Z]$')

regexp_like(text, '[^a-z]') --대괄호 안의 문자가 아닌 행

regexp_like(text, '^[^a-z]') --대괄호 안의 문자가 아닌 문자로 시작하는 행

regexp_like(text, '[a|z]') --a나 z가 포함되어 있는 행을 모두 출력

regexp_like(text, '[0-9]{2} \) [0-9]{3}') --02)333. 전화번호 지역번호

regexp_like(text, '^...v.') -- 4번째 자리에 v가 있는 행 출력

regexp_like(text, '^[10]{2} \. [10]{2} \. [10]{2}') --10.01.01.xxx([]안에 순서 상관없음) ip주소 찾을때

NOT regexp_like(text, '^[A-Za-z]') --특정조건을 제외한 모든행 출력


EX5. 특수문자 찾기

- 메타캐릭터 조심

- 탈출문자 (Escape character) : \



- REGEXP_REPLACE : 주어진 문자열에서 특정 패턴을 찾아서 주어진 다른 모양으로 치환하는 함수

EX1. 모든 숫자를 특수 기호로 변경

regexp_replace(text, '[[:digit:]]', '@') --모든숫자부분을 @로 수정


EX2. 특정 패턴을 찾아서 패턴 변경

regexp_replace(text, '([0-9])', '\1-*') --모든 숫자부분 뒤에 '-*'을 추가

regexp_replace(text, '\.', '') -- 모든 . 부분을 삭제

regexp_replace(text, '\.', '/', 1, 1) -- 첫번째 . 부분을 /로 변경


EX3. 사용자에게 입력 받은 문자가운데 공백이 여러개 있을 경우 공백제거

regexp_replace('abc   123', '( ){1,}', '') --공백이 1개 이상일 경우 제거  {n,} : n개 이상 


EX4. 사용자가 검색어를 입력할때 공백 문자를 가장 먼저 입력하고 아이디 중간에도 공백을 제거할때

regexp_replace(text, '( ){1,}', '')


EX5. 특정 문자열의 형태를 다른 형태로 바꿀 때

regexp_replace('20140930', '( [[:digit:]]{4}) ([[:digit:]]{2}) ([[:digit:]]{2})', '\1:\2:\3')

-- 20140930 형태로 이루어진 데이터를 2014:09:30의 형태로 변형



- REGEXP_INSTR : 특정 패턴이 출현하는 첫 위치 값을 반환하는 함수

EX1. 특정 문자의 위치 찾기

regexp_instr(text, '\*') --text 중에서 '*'의 첫 위치값을 반환

regexp_instr('aa bb cc dd ee', '[^ ]+', 1, 3) -->7, 처음이 공백이 아닌부분 중, 1번부터 검사하여 3번째 위치

regexp_instr('abc ade abc adf', '[^ ]+[abc]', 1, 2)  --처음이 공백이 아니고 abc로 시작되는 두번째글짜의 첫위치



- REGEXP_SUBSTR : 특정 패턴에서 주어진 문자를 추출해내는 함수

EX1. http://www.abc.net 에서 http://부분을 제거하고 출력

LTRIM(regexp_substr(hpage, '/([[:alnum:]]+\.?){3,4}?', '/' ))


EX2. moon92999@gmail.com 에서 @뒤에 있는 주소만 출력

LTRIM(regexp_substr(email, '@([[:alnum:]]+\.?){3,4}?', '@' ))



* 11g에서 추가된 정규식 함수

REGEXP_COUNT : 특정 문자의 개수를 세는 함수


- REGEXP_SUBSTR



'oracle > [SQL] SQL' 카테고리의 다른 글

6장. DDL  (0) 2014.10.02
5장. JOIN  (0) 2014.10.02
4장. 복수행 함수 (그룹함수)  (0) 2014.10.01
2장. 단일행 함수  (0) 2014.09.29
1장. SELECT  (0) 2014.09.29

댓글