rueki
SQL에서의 정규표현식(Regular Expression) 본문
- 정규표현식 함수의 문법
기본 연산자 ,앵커, 수량사
- 수량사 (Quantifier)
수량사는 선행 표현식의 일치 횟수를 지정한다.
패턴은 최대로 일치시키는 탐욕적(Greedy) 방식으로 동작한다.
연산자 | 설명 |
? | 0회 또는 1회 일치 |
* | 0회 또는 그 이상의 횟수로 일치 |
+ | 1회 또는 그 이상의 횟수로 일치 |
{m} | M회 일치 |
{m,} | 최소 m회 일치 |
{,m} | 최대 m회 일치 |
{m,m} | 최소 m회, 최대 n회 일치 |
Ex) select regexp_substr('ac','ab?c') as c1,
regexp_substr('abc', 'ab?c') as c2,
regexp_substr('abbc', 'ab?c') as c3
regexp_substr('ac', 'ab*c') as c4,
regexp_substr('abc', 'ab*c') as c5,
regexp_substr('abbc','ab*c') as c6
regexp_substr('ac','ab+c') as c7,
regexp_substr('abc','ab+c') as c8
regexp_substr('abbc', 'ab+c') as c9
from dual;
Ex) select regexp_substr('ababc', '(ab)+c') as c1,
regexp_substr('ab+c') as c2,
regexp_substr('abd', 'a(b|c)d' as c3,
regexp_substr('abd', 'ab|cd') as c4 from dual;
- Posix 문자클래스
오라클 정규표현식은 posix 문자 클래스를 지원한다.
Posix 문자 클래스는 문자 리스트에 사용해야한다.
문자 클래스 |
설명 |
동일 |
[:digit:] |
숫자 |
[0-9] |
[:lower:] |
소문자 |
[a-z] |
[:upper:] |
대문자 |
[A-Z] |
[:alpha:] |
영문자 |
[a-zA-Z] |
[:alnum:] |
영문자와 숫자 |
[0-9a-zA-Z] |
[:blank:] |
공백문자 |
|
[:space:] |
공간문자(space, enter, tab) |
|
[:punct:] |
구두점 기호 |
|
[:xdigit:] |
16진수 |
|
- Regexp_count 함수문자열에서 해당되는 패턴이 몇 번 등장하는 지 알아내기 위한 함수
Ex) SELECT REGEXP_COUNT(
'ccacctttccctccactcctcacgttctcacctgtaaagcgtccctccctcatccccatgcccccttaccctgcag
ggtagagtaggctagaaaccagagagctccaagctccatctgtggagaggtgccatccttgggctgcagagagaggag
aatttgccccaaagctgcctgcagagcttcaccacccttagtctcacaaagccttgagttcatagcatttcttgagtt
ttcaccctgcccagcaggacactgcagcacccaaagggcttcccaggagtagggttgccctcaagaggctcttgggtc
tgatggccacatcctggaattgttttcaagttgatggtcacagccctgaggcatgtaggggcgtggggatgcgctctg
ctctgctctcctctcctgaacccctgaaccctctggctaccccagagcacttagagccag',
'gtc') AS Count
FROM dual;
- Regexp_replace
replace 함수와 같은 기능을 하지만, 해당되는 패턴으로 replace 하는 함수이다.
Ex) Select ename, replace(sal, 0, '*') from emp;
연산자 |
영문 |
설명 |
. |
dot |
모든 문자와 일치 |
| |
or |
대체 문자를 구분 |
\ |
Back slash |
다음 문자를 일반 문자로 처리 |
Ex) selec regexp_substr('aab','a.b') as c1,
regexp_substr('abb','a.b') as c2,
regexp_substr('acb','a.b') as c3,
regexp_substr('abc', 'a.b') as c4
From dual;
- 앵커
연산자 |
영문 |
단일행 방식 |
다중행 방식 |
^ |
carrot |
문자열의 시작 |
행의 시작 |
$ |
dollar |
문자열의 끝 |
행의 끝 |
create table as employees
as
select * from hr.employees;
문제 428. 이름에 EN 혹은 IN을 포함하고 있는 사원들의 이름과 월급을 출력하세요
select ename, sal, regexp_substr(ename,'EN|IN') from emp;
select ename, sal, regexp_substr(ename,'EN|IN') from emp;
문제 431. 이름의 첫글자가 ST로 끝나면서 끝 글자가 en으로 끝나는 사원들의 first_name을 출력하세요
Select first_name From employees
Where regexp_like(first_name, '^St(.)+en$');
Select first_name From employees
Where regexp_like(first_name, '^St(.)+en$');
문제 436. 위치 테이블에서 주소에서 알파벳으로 시작하지 않는 곳의 자리수를 출력하세요
select regexp_instr(street_address, '[^[:alpha:]]')
from locations;
select regexp_instr(street_address, '[^[:alpha:]]')
from locations;
문제 443. 이름과 월급까지 출력하는 데 월급 숫자에서 0~3까지를 *로 출력하세요.
select regexp_replace(birth,'[0-3]','*') from emp;
select regexp_replace(birth,'[0-3]','*')
from emp;
'SQL' 카테고리의 다른 글
SQLD 1장 데이터 모델링 정리 (0) | 2020.05.23 |
---|---|
SQLD 최적화 기본 원리 정리 (0) | 2020.05.21 |
SQL CHAR와 VARCHAR2의 차이 (0) | 2020.04.24 |
SQL INDEX (0) | 2020.04.21 |
SQL Table, View (0) | 2020.04.17 |