10g 이상부터 가능
Oracle 10g에서는 REGEXP_로 시작하는 함수를 지원(Regular Expression)
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;
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
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
ex) a의 위치 반환
SELECT REGEXP_INSTR('Regular Expression', 'a') AS "REGEXP_INSTR" FROM dual;
-- 결과
REGEXP_INSTR
---------------
6