정규표현식
* 메타 문자
@C:\oraclexe\labs\regexp_tab.sql;
SELECT * FROM t1;
q1.sql >
SELECT fname, lname
FROM t1
WHERE REGEXP_LIKE (fname, '^Ste(v|ph)en$');
q2.sql >
SELECT fname, phone
FROM t1
WHERE REGEXP_LIKE (phone, '...\...\.....\.......');
- . : 정규표현식에서는 문자 하나를 대신함.
- \ : 예외 처리
q3.sql >
SELECT fname, phone
FROM t1
WHERE REGEXP_LIKE (phone, '[0-9]{3}\.[0-9]{2}\.[0-9]{4}\.[0-9]{6}');
- [] : 문자(숫자)의 범위
- {} : 자리수
q4.sql >
SELECT fname, phone, REGEXP_REPLACE ( phone , '\.' , '-' ) new_format
FROM t1;
- REGEXP_REPLACE : 다른 문자로 대체
q5.sql >
SELECT fname, phone,
REGEXP_REPLACE (phone, '(\d{3})\.(\d{3})\.(\d{4})','(\1)-\2-\3') new_phone
FROM t1;
- \d : 숫자(digit). [0-9]와 같은 의미.
- 뒤의 \1, 2, 3 : 그룹을 지정, '\'는 앞의 표현식과 일치하기 위해 사용.
q6.sql >
SELECT fname, addr,
REGEXP_INSTR ( addr, '[[:alpha:]]' ) pos ,
phone,
REGEXP_INSTR ( phone, '[[:alpha:]]') pos
FROM t1;
- [:alpha:] : 범주를 지정(alpha: 알파벳, digit: 숫자)해서 해당되는 부분이 나타나는 자리수를 찍어줌.
해당되는 것이 없으면 0.
q7.sql >
SELECT fname, addr,
REGEXP_SUBSTR ( addr, ' [^ ]+ ') road
FROM t1;
- REGEXP_SUBSTR : 첫 번째 나오는 문자를 검색한다.
- [^#] : #가 아닌, 부정의 의미.
- + : 한 개 이상.
- ' [^ ]+ ' : 공백과 공백 사이를 추출하라.
q8.sql >
SELECT fname, phone,
REPLACE(REGEXP_SUBSTR(phone,'\.(\d{3})\.'),'.') code
FROM t1;
- 정규표현식도 중첩이 가능하다.
q9.sql >
SELECT fname, addr,
REGEXP_COUNT(addr,'a') cnt
FROM t1;
- REGEXP_COUNT : 표현된 횟수
q11.sql >
SELECT REGEXP_SUBSTR ('0123456789',
'(123)(4(56)(78))', 1, 1, 'i', 1 ) "Exp1" ,
REGEXP_SUBSTR ('0123456789',
'(123)(4(56)(78))', 1, 1, 'i', 2 ) "Exp2" ,
REGEXP_SUBSTR ('0123456789',
'(123)(4(56)(78))', 1, 1, 'i', 3 ) "Exp3" ,
REGEXP_SUBSTR ('0123456789',
'(123)(4(56)(78))', 1, 1, 'i', 4 ) "Exp4"
FROM dual;
- 순서 : 123 → 45678 → 56 → 78
q10.sql >
SELECT REGEXP_INSTR ('0123456789',
'(123)(4(56)(78))', 1, 1, 0, 'i', 2 ) "Position"
FROM dual;
- 자리값
q12.sql >
SELECT
REGEXP_INSTR('ccacctttccctccactcctcacgttctcacctgtaaagcgtccctc
cctcatccccatgcccccttaccctgcagggtagagtaggctagaaaccagagagctccaagc
tccatctgtggagaggtgccatccttgggctgcagagagaggagaatttgccccaaagctgcc
tgcagagcttcaccacccttagtctcacaaagccttgagttcatagcatttcttgagttttca
ccctgcccagcaggacactgcagcacccaaagggcttcccaggagtagggttgccctcaagag
gctcttgggtctgatggccacatcctggaattgttttcaagttgatggtcacagccctgaggc
atgtaggggcgtggggatgcgctctgctctgctctcctctcctgaacccctgaaccctctggc
taccccagagcacttagagccag',
'(gtc(tcac)(aaag))',
1, 1, 0, 'i',
1) "Position"
FROM dual;
- 쿼리문은 DNA 유전자 배열
- 특별한 배열을 찾을 때 사용
q14.sql >
SELECT REGEXP_COUNT(
'ccacctttccctccactcctcacgttctcacctgtaaagcgtccctccctcatccccatgcccccttaccctgcag
ggtagagtaggctagaaaccagagagctccaagctccatctgtggagaggtgccatccttgggctgcagagagaggag
aatttgccccaaagctgcctgcagagcttcaccacccttagtctcacaaagccttgagttcatagcatttcttgagtt
ttcaccctgcccagcaggacactgcagcacccaaagggcttcccaggagtagggttgccctcaagaggctcttgggtc
tgatggccacatcctggaattgttttcaagttgatggtcacagccctgaggcatgtaggggcgtggggatgcgctctg
ctctgctctcctctcctgaacccctgaaccctctggctaccccagagcacttagagccag',
'gtc') AS Count
FROM dual;
- 'gtc'가 몇 번 나오는지 count
* 기타 메타 문자들
- + : 1번 이상
- ? : 0번 또는 1번
- * : 0번 이상
- {m, } : m 이상
- {m, n} : m 이상 ~ n 이하
- ( ... ) : 표현식을 묶어줄 때 사용
- $ : 끝
- ^ : 시작
- \ : escape
- \n : 선행하는 표현식의 위치
- \d : 숫자
- [:class:] : class 종류를 지정
- [^:class:] : class가 아닌 것
SQL 끝. DB Admin 시작!
'스마트웹&콘텐츠 개발자 과정 > Oracle' 카테고리의 다른 글
Admin 수업 (0) | 2018.06.08 |
---|---|
DBA 수업 (0) | 2018.06.07 |
SQL (6/4 오후) (0) | 2018.06.04 |
5/31 오후 (0) | 2018.05.31 |
5/30 오후 (0) | 2018.05.30 |