오라클 - 정규식 사용

배세훈·2021년 8월 6일
0

DB

목록 보기
6/19

10g 이상부터 가능

Oracle 10g에서는 REGEXP_로 시작하는 함수를 지원(Regular Expression)

  1. REGEXP_LIKE
  • LIKE 연산자와 유사하며, 표현식 패턴(Regular Expression Pattern)을 수행하여, 일치하는 값을 반환합니다.
  • 문법: REGEXP_LIKE(srcstr, pattern [, match_option])
  • srcstr: 소스 문자열, 검색하고자 하는 값
  • pattern: Regular Expression Operator를 통해 문자열에서 특정 문자를 보다 다양한 pattern으로 검색하는 것이 가능.
  • match_option: match를 시도할 때의 옵션, 찾고자 하는 문자의 대소문자 구분이 기본으로 설정. 대소문자를 구분할 필요가 없다면 'i' 옵션 사용을 지정한다.

ex) pattern 예시
[[:digit:]] - 숫자인 것
[^[:digit:]] - 숫자가 아닌 것
[^expression] - expression의 부정
[] : []안에 명시되는 하나의 문자라도 일치하는 것이 있으면 나타냄.

ex) 제품의 이름중에 'AB' 다음에 'C'를 포함하지 않은 문자열을 찾기

SELECT user_name
FROM USER
WHERE REGEXP_LIKE(user_name, 'AB[^C]');

ex) 제품 이름에 'AB' 다음 'C'나 'D'를 포함하는 문자열을 찾기

SELECT user_name
FROM USER
WHERE REGEXP_LIKE(user_name, 'AB[CD]');

ex) 메일 주소에 '@' 포함되도록 설정

ALTER TABLE USER
ADDD CONSTRAINT email
CHECK(REGEXP_LIKE(email, '@')) NOVALIDATE;
  1. REGEXP_SUBSTR
  • SUBSTR 함수의 기능을 확장. 주어진 문자열을 대상으로 정규 표현식 패턴을 수행하여, 일치하는 하위 문자열을 반환합니다.
  • 문법: REGEXP_SUBSTR(srcstr, pattern, [,position[,occurrence[,match_option]]])
  • srcstr: 소스 문자열
  • position: Oracle이 문자열에서 특정 문자를 어디에서 찾아야 하는지 위치를 나타냄. 기본으로 1로 설정되어 있으므로 문자열의 처음부터 검색을 시작
  • occurrence: 검색하고자 하는 문자열에서 특정 문자의 발생 횟수. 기본으로 1로 설정되어 있으며, 이는 Oracle이 문자열에서 첫번째 발생 pattern을 찾는다는 의미.
  • match_option: match를 시도할 때의 옵션

ex)

SELECT REGEXP_SUBSTR(email, '[%@]+', 1, 1) AS "ID", REGEXP_SUBSTR(email, '[^@]+', 1, 2) AS "MailAddr" FROM ( SELECT 'higuys@test.com' email FROM dual );

-- 결과
ID 			MailAddr
-----------------------
higuys		test.com
  1. REGEXP_REPLACE
  • 주어진 문자열을 대상으로 정규 표현식 패턴을 조사하여, 다른 문자로 대체합니다.
  • 문법: REGEXP_REPLACE(srcstr, pattern [,replacestr[,position[,occurrence[,match_option]]]])
  • replacestr: 대체하고자 하는 문자열을 나타냅니다

ex) 주민번호 뒷자리를 '*'로 표현

SELECT REGEXP_REPLACE(SSN, '[0-9]', '*', 7) AS "SSN"
FROM ( SELECT '9401021234567' SSN FROM dual);

-- 결과
SSN
---------------
940102*******

ex) 둘 이상의 공백 문자를 하나로 대체하여 가독성을 높이자.

SELECT REGEXP_REPLACE('Oracle  is  the Information Company', '( ){2,}', '') AS "Result" FROM dual;

-- 결과
Result
-------------------
Oracle is the Information Company

ex) 전화번호의 표현 방식을 3자리, 3자리, 4자리로 묶어 식별력을 높이자

SELECT REGEXP_REPLACE('555.123.4567', '([[:digit:]]{3}|.([[:digit:]]{3})|.([[:digit:]]{4})','(|1) |2 - |3') AS "Result1" FROM dual;

-- 결과
Result1
---------------
(555) 123 - 4567
  • [:digit:] : 숫자 값
  • [:alpha:] : 문자 값
  • [:alnum:] : 문자와 숫자를 함께 사용
  1. REGEXP_INSTR
  • 정규 표현을 만족하는 부분의 위치를 반환합니다.
  • 문법: REGEXP_INSTR(srcstr, pattern [,position[, occurrence[, returnparam[,match_option]]]])
  • position: 검색 시작 위치
  • occurrence: 발생 횟수
  • returnparam: 반환 옵션
  • match_option: match를 시도할 때의 옵션

ex) a의 위치 반환

SELECT REGEXP_INSTR('Regular Expression', 'a') AS "REGEXP_INSTR" FROM dual;

-- 결과
REGEXP_INSTR
---------------
6
profile
성장형 인간

0개의 댓글