소스: sql-src/adv_09_regex/02_extract_replace.sql. 이 파일은 \1 역참조를 쓰므로 SET MODE Oracle 로 실행합니다. 메모에서 ORD-연도4자리-번호4자리 를 뽑습니다.
SELECT
id
, memo
, REGEXP_SUBSTR(memo, 'ORD-[0-9]{4}-[0-9]{4}') AS first_ord
FROM contact
ORDER BY id;ID | MEMO | FIRST_ORD
---+-------------------------------------------+--------------
1 | 주문 ORD-2024-0015 문의 | ORD-2024-0015
2 | ORD-2024-0021, ORD-2024-0034 환불 | ORD-2024-0021
3 | 메모 없음 | NULL
4 | ord-2024-0040 소문자 표기 | NULL
5 | 번호 오류 | NULL
6 | ORD-2023-0007 이전 주문 | ORD-2023-0007
7 | ORD-2024-0051 ORD-2024-0052 ORD-2024-0053 | ORD-2024-0051
8 | NULL | NULL
9 | 연락 불가 | NULL
(9행)맞는 부분이 없으면 NULL 입니다. 3·4·5·9번 행이 그렇고, 4번 행은 소문자라 대소문자를 구분하는 기본 동작에서 빠졌습니다. 세 번째 인자는 시작 위치, 네 번째 인자는 몇 번째 일치인지입니다.
SELECT
id
, REGEXP_SUBSTR(memo, 'ORD-[0-9]{4}-[0-9]{4}', 1, 2) AS second_ord
FROM contact
WHERE id IN (1, 2, 7)
ORDER BY id;결과는 2번 행 ORD-2024-0034, 7번 행 ORD-2024-0052 입니다. 1번 행은 주문번호가 하나뿐이라 두 번째가 NULL 입니다. 다섯 번째 인자에 'i' 를 주면 4번 행의 소문자 표기도 뽑히고, 여섯 번째 인자에 괄호 번호를 주면 그 묶음만 뽑습니다. 아래는 연도만 뽑는 예입니다.
SELECT
id
, REGEXP_SUBSTR(memo, 'ORD-([0-9]{4})-[0-9]{4}', 1, 1, NULL, 1) AS ord_year
FROM contact
WHERE id IN (1, 6, 9)
ORDER BY id;결과는 1번 행 2024, 6번 행 2023, 주문번호가 없는 9번 행 NULL 입니다.
숫자가 아닌 문자를 모두 지우는 것이 가장 흔한 치환입니다. [^0-9] 를 빈 문자열로 바꿉니다.
REGEXP_REPLACE(phone, '[^0-9]', '') 는 010 9876 5432 를 01098765432 로 만듭니다. 다음은 숫자만 남긴 뒤 괄호 묶음 세 개를 \1-\2-\3 으로 다시 이어 하이픈 형식으로 맞추는 예입니다.
SELECT
id
, phone
, REGEXP_REPLACE(REGEXP_REPLACE(phone, '[^0-9]', ''), '^(01[016789])([0-9]{3,4})([0-9]{4})