컴퓨터활용/오라클

정규식 이용 SQL

멜번초이 2016. 12. 11. 21:15






소문자가 하나라도 들어있는 데이터만 추출하기 위하여  정규식을 이용한 SQL 구문을 작성하고자 인터넷을 찾아보니 아주 정리를 잘 해 놓은 블로그가 있어서 갈무리 한다.

참조사이트 : http://goalker.tistory.com/71

[사용예제] 

소문자 영문자가 들어있는 행 출력  

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'[a-z]') ;

대문자 영문자가 들어있는 행 출력  

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'[A-Z]') ;

대소문자 영문자가 들어있는 행 출력 

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'[a-zA-Z]') ; 


소문자로 시작하고 뒤에 공백이 있는 모든 행 출력 

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'[a-z]  ') ;


소문자로 시작하고 공백이 1칸 있고 숫자로 끝나는 행 출력

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'[a-z] [0-9]') ;


공백이 있는 모든 데이터를 찾고 싶은 경우

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'[[:SPACE:]]') ;


대문자가 연속적으로 2글자 이상오는 경우 출력

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'[A-Z]{2}') ;


대문자가 연속적으로 3글자 이상오는 경우 출력

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'[A-Z]{3}') ;


시작을 대문자나 소문자로 하는 행 출력

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'^[a-zA-Z]') ;


시작을 숫자나 대문자로 시작하는 행 출력

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'^[0-9A-Z]') ;


여러가지 조건을 줄 경우 바 기호(|)  를 사용하여 연결 할 수도 있음

소문자로 시작하거나, 숫자로 시작하는 경우

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'^[a-z] | ^[0-9]') ; 


STUDENT 테이블에서 학생의 ID중 첫 글자가 s(소문자) 로 시작하고 두번째 글자가 a 나 t가 나오는 id 출력

SELECT name, id FROM STUDENT WHERE REGEXP_LIKE( id,'^s(a|t).') ;


소문자로 끝나는 모든 행 출력

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'[a-z]$') ;


^(캐럿)문자가 대괄호 안에 들어갈 경우에는 대괄호 안의 문자가 아닌 다른 것만 출력하라는 의미

소문자로 시작하지 않는 행을 모두 출력

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'^[^a-z]') ;


STUDENT 테이블에서 학생의 id를 조사해 4번째 자리에 v(소문자) 가 있는 행을 출력

SELECT name, id FROM STUDENT WHERE REGEXP_LIKE( id,'^...v.') ;


특정 조건을 제외한 결과 출력  (NOT)

영문자(대소문자)를 포함하지 않는 행을 출력

SELECT * FROM reg_test WHERE NOT REGEXP_LIKE( text,'[A-Za-z]') ;


특수문자 찾기 

( '*' 나 '?' 같은 기호는 SQL에서 '모든것' 이라는 뜻을 가진 메타캐릭터 문자이기 때문에 \붙여줘야 한다.)


?가 들어간 행 출력

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'\?') ;


?가 들어가지 않는 행 출력

- SELECT * FROM reg_test WHERE NOT REGEXP_LIKE( text,'\?') ;


소문자가 들어 있는 모든 행을 출력 (찾고자 하는 쿼리의 앞에 '*' 나 '?' 를 사용 뒤에 쓰면 적용X)

SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'*[a-z]') ;

- SELECT * FROM reg_test WHERE REGEXP_LIKE( text,'?[a-z]') ;



숫자 부분을 '@' 기호로 변경

SELECT text , REGEXP_REPLACE( text,'[[:digit:]]','@')  FROM reg_test ;


숫자를 찾아서 숫자 뒤에 '-*' 을 추가

SELECT text , REGEXP_REPLACE( text,'[0-9]','\1-*')  FROM reg_test ;



reg_test2 테이블에서 ip의 .(dot) 부분을 모두 삭제하고 출력

SELECT no, ip, REGEXP_REPLACE(ip,'\.','') FROM reg_test2 ;


reg_test2 테이블에서 ip의 첫번째 .(dot) 부분을 '/' (슬래쉬) 기호로 변경해서 출력

SELECT no, ip, REGEXP_REPLACE(ip,'\.','/',1,1) FROM reg_test2 ;


사용자가 ID를 'abc 123' 이렇게 입력했을 경우 'abc' 와 '123' 사이의 공백을 없애고 싶은 경우

SELECT REGEXP_REPLACE('abc  123','( ){1,}','') FROM dual ;


위 예제에서 {1,} 부분을 {1}로 해도 무방

{} 내의 숫자는 앞문자가 나타나는 횟수 또는 범위를 의미

예를 들어 a{5} 'a' 의 5번 반복인 aaaaa

              a{3,} 는 'a'가 3번 이상 반복인 aaa , aaaa , aaaaa ... 등을 의미

              a{3,5} 는 aaa , aaaa , aaaaa 를 의미

              ab{2,3} 은 뒤의 b가 2번, 3번 반복된 형태로 abb , abbb 를 의미

              {,}를 붙이면 이상을 의미

               


아이디 입력시 : (공백)  75   true 를 입력하였을때 중간 중간 공백을 모두 제거하는 방법

SELECT studno,name,id FROM student WHERE id=REGEXP_REPLACE('&id','( ){1,}','') ;



text 중에서 '*' 의 위치를 찾는 방법

SELECT text, REGEXP_INSTR(text,'\*') FROM reg_test ;



'abc* *def %ghi,jkl' 이란 문자열에서 첫 글자가 공백이 아니고 ('[^ ]') 그 후에 'def'가 나오는 부분을 추출

SELECT REGEXP_SUBSTR('abc* *def %ghi,jkl' , '[^ ]+[def]') FROM dual ;



주어진 문자열에서 소문자 'a'가 몇개인지 찾아 주는 예

SELECT text, REGEXP_COUNT(text,'a') FROM reg_test ;