본문 바로가기

나 취준생/SQL

SQL - 정규식 함수

320x100

** 정규식 함수


데이터 검색을 좀 더 상세하게 하려 할 때, 기존의 함수로는 표현할 수 없는

데이터 검색을 할 수 있게 해주는 함수


Regular expression ( 정규 표현식 )


정규 표현식 코드는 오라클 뿐만 아니라 다른 언어에서도 공통적으로 사용하는 표현식 코드이다.

오라클 10.1 버전부터 정규 표현식을 지원한다.

오라클 데이터베이스는 정규 표현식의 POSIX 연산자를 지원한다.

POSIX는 Portable Operation System Interface 의 약자로,

시스템간 호환성을 위해 미리 정의된 인터페이스를 의미한다.


Posix 연산자에는 기본 연산자, 앵커, 수량사, 서브 표현식, 역참조, 문자 리스트, posix 문자 클래스 등이 있다.




* 기본 연산자


연산자                            영문                            설명


   .                                 dot                        모든 문자와 일치

   |                                  or                         대체 문자를 구분

  \                             backslash            다음 문자를 일반 문자로 처리


예제 : select regexp_substr('aab','a.b') as c1,

regexp_substr('abb','a.b) as c2,

regexp_substr('acb','a.b) as c3

regexp_substr('adc','a.b) as c4

from dual;



예제 : 이름에 EN, IN 이 들어가는 사원들의 이름과 월급을 출력하기


기본 식


select ename, sal

 from emp

 where ename like '%EN%' or ename like '%IN%';




정규식 함수 사용


select ename, sal

 from emp

  where regexp_like(ename,'EN|IN');



--> 이렇게 하면 where 절을 계속 늘려나가지 않아도 되니

      코드가 복잡할수록 훨씬 더 간결하게 작성할 수 있다.


예제 : 사원들 중 성이 St로 시작하고 en으로 끝나는 사원들 출력하기


기본 식


select first_name

 from employees

 where first_name like 'St%en';


정규식 함수 사용


select first_name

 from employees

where regexp_like(first_name,'^St(.)+en$');


--[설명]--

^ : 시작을 나타낸다.

$ : 끝을 나타낸다.

--> St로 시작하면서 끝이 en으로 끝난다.


가운데에 있는 (.) 에서 . 은 한 자리를 나타내는데,

+ 가 여러 개를 나타내는 것을 의미하기 때문에

한 자리가 여러개인 것을 나타낸다.


결과적으로 St와 en 사이에 여러 개의 철자가 와도 된다는 것을 의미한다.




* 서브 표현식


서브 표현식은 표현식을 소괄호로 묶은 표현식이다.

서브 표현식은 하나의 단위로 처리된다.


연산자                                        설명


     (표현식)                            괄호 안의 표현식을 하나의 단위로 취급

   +                                 1회 또는 그 이상의 횟수로 일치


예제 : select regexp_substr('ababc','(ab)+c') as c1,

regexp_substr('ababc','ab+c') as c2,

regexp_substr('abd','a(b|c)d') as c3,

regexp_substr('abd','ab|cd') as c4

from dual;


c1은 +가 (ab)를 하나의 알파뱃으로 봐서, ababc가 나왔고

c2는 +가 b를 하나의 알파뱃으로 봐서 abc가 나왔다.




* regexp_count 함수 ( count의 업그레이드 버전 )


특정 단어나 철자가 문장에서 몇 번 반복되어서 출력되는지 확인하는 함수


예제 : 다음 문자열에서 gtc가 몇 번 나왔는지 세기


SELECT REGEXP_COUNT(

'ccacctttccctccactcctcacgttctcacctgtaaagcgtccctccctcatccccatgcccccttaccctgcagggtagagtaggctagaaaccagagagctccaagctccatctgtggagaggtgccatccttgggctgcagagagaggagaatttgccccaaagctgcctgcagagcttcaccacccttagtctcacaaagccttgagttcatagcatttcttgagttttcaccctgcccagcaggacactgcagcacccaaagggcttcccaggagtagggttgccctcaagaggctcttgggtctgatggccacatcctggaattgttttcaagttgatggtcacagccctgaggcatgtaggggcgtggggatgcgctctgctctgctctcctctcctgaacccctgaaccctctggctaccccagagcacttagagccag','gtc') AS Count

FROM dual;


예제 : 이름에 O가 들어가는 사원 수 세기


count랑은 다른게 매 행 출력된다.

그래서 정말 그 수가 세고 싶다면


select sum(건수)

 from

    (select ename,regexp_count(ename,'O') as 건수

    from emp);


다음과 같이 서브 쿼리로 한 번 더 세줘야한다.



* regexp_replace ( replace의 업그레이드 버전 )


예제 : 이름과 월급을 출력하는데 월급을 출력할 때 replace 함수를 이용해서

숫자 0을 *로 출력하기


select ename, replace( sal, 0, '*' )

 from emp;




예제 : 이름과 월급을 출력하는데 월급을 출력할 때

숫자 0~3을 *로 출력하기


select ename, regexp_replace( sal, '[0-3]', '*')

 from emp;




반응형

'나 취준생 > SQL' 카테고리의 다른 글

SQL - WITH 절  (0) 2020.11.13
SQL - 다중 insert 문  (0) 2020.11.13
SQL - 외부 테이블 (external table)  (0) 2020.11.13
SQL - 3개 이상의 테이블 조인  (0) 2020.11.13
SQL - 데이터의 품질 높이기 ( 테이블 제약 걸기 )  (0) 2020.11.11