정규 표현식(Regular Expression)
- 문자열의 공통된 규칙을 보다 일반화 하여 표현하는 방법
- 정규 표현식 사용 가능한 문자함수 제공(regexp_replace, regexp_substr, regexp_instr, ...)
ex) 숫자를 포함하는, 숫자로 시작하는 4 자리, 두번째 자리가 A 인 5 글자
정규 표현식 종류
REGEXP_REPLACE
- 정규식 표현을 사용하여 문자열 내의 패턴을 다른 문자열로 대체
# 문법
REGEXP_REPLACE(source_string, pattern, replace_string, position, occurrence, match_parameter)
- source_string : 검색할 문자열
- pattern : 대체할 패턴을 정의하는 정규 표현식
- replace_string : 대체할 문자열 (생략시 문자열 삭제)
- position : 검색을 시작할 위치. 기본값은 1
- occurrence : 대체할 발생 횟수. 기본값은 0이며, 모든 발생을 대체
- match_parameter : 일치 조건을 지정 (예: 'i'는 대소문자 구분 없음).
# 옵션
- c : 대소를 구분하여 검색
- i : 대소를 구분하지 않고 검색
- m : 패턴을 다중라인으로 선언 가능
# 예시
# 모든 공백을 밑줄로 대체
SELECT REGEXP_REPLACE('Hello World, Welcome!', '\s', '_') AS replaced_string
FROM dual;
결과 :
Hello_World,_Welcome!
# 숫자를 문자로 대체
SELECT REGEXP_REPLACE('Phone: 123-456-7890', '\d', '#') AS replaced_string
FROM dual;
결과 :
Phone: ###-###-####
REGEXP_SUBSTR
- 정규식 표현식 사용하여 문자열 내에서 일치하는 부분 문자열을 반환
- 옵션은 REGEXP_REPLACE 와 동일
# 문법
REGEXP_SUBSTR(source_string, pattern, position, occurrence, match_parameter)
- source_string : 검색할 문자열
- pattern : 검색할 패턴을 정의하는 정규 표현식
- position : 검색을 시작할 위치. 기본값은 1
- occurrence : 검색할 발생 횟수. 기본값은 1
- match_parameter : 일치 조건을 지정합니다 (예: 'i'는 대소문자 구분 없음).
# 예시
# 이메일 주소 추출
SELECT REGEXP_SUBSTR('Contact us at support@example.com for more info.', '\S+@\S+\.\S+') AS email
FROM dual;
결과 :
support@example.com
# 특정 형식의 날짜 추출
SELECT REGEXP_SUBSTR('The event is on 2024-06-13.', '\d{4}-\d{2}-\d{2}') AS date
FROM dual;
결과 :
2024-06-13
REGEXP_INSTR
- 정규 표현식을 사용하여 문자열 내에서 특정 패턴이 처음으로 발생하는 위치를 반환
- 옵션은 REGEXP_SUBSTR 과 동일
# 문법
REGEXP_INSTR(source_string, pattern, position, occurrence, return_option, match_parameter)
- source_string : 검색할 문자열
- pattern : 검색할 패턴을 정의하는 정규 표현식
- position : 검색을 시작할 위치. 기본값은 1
- occurrence : 검색할 발생 횟수. 기본값은 1
- return_option : 0이면 시작 위치를 반환하고, 1이면 종료 위치를 반환. 기본값은 0
- match_parameter : 일치 조건을 지정합니다 (예: 'i'는 대소문자 구분 없음).
# 예시
# 문자열에서 특정 단어의 시작 위치 찾기
SELECT REGEXP_INSTR('Hello World, Welcome to the World of SQL', 'World', 1, 1, 0, 'i') AS position
FROM dual;
결과 :
7
# 문자열에서 특정 단어의 두 번째 발생 위치 찾기
SELECT REGEXP_INSTR('Hello World, Welcome to the World of SQL', 'World', 1, 2, 0, 'i') AS position
FROM dual;
결과 :
28
# 문자열에서 숫자의 위치 찾기
SELECT REGEXP_INSTR('The price is 100 dollars', '\d+', 1, 1, 0) AS position
FROM dual;
결과 :
13
REGEXP_LIKE
- 정규 표현식을 사용하여 문자열이 특정 패턴과 일치하는지 확인하는 데 사용
- 주로 데이터 검증 및 텍스트 검색에 유용
- 옵션은 REGEXP_REPLACE 와 동일
# 문법
REGEXP_LIKE(source_string, pattern, match_parameter)
- source_string : 검사를 수행할 문자열
- pattern : 검색할 패턴을 정의하는 정규 표현식
- match_parameter : 일치 조건을 지정하는 선택적 매개변수 (예: 'i'는 대소문자 구분 없음)
# 예시
# 이메일 주소 형식 검증
SELECT email,
CASE
WHEN REGEXP_LIKE(email, '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$') THEN 'Valid'
ELSE 'Invalid'
END AS email_status
FROM (SELECT 'example@example.com' AS email FROM dual
UNION ALL
SELECT 'invalid-email.com' AS email FROM dual);
결과 :
| email | email_status |
|----------------------|--------------|
| example@example.com | Valid |
| invalid-email.com | Invalid |
# 특정 패턴의 전화번호 검증
SELECT phone_number,
CASE
WHEN REGEXP_LIKE(phone_number, '^\d{3}-\d{3,4}-\d{4}$') THEN 'Valid'
ELSE 'Invalid'
END AS phone_status
FROM (SELECT '123-456-7890' AS phone_number FROM dual
UNION ALL
SELECT '123-45-7890' AS phone_number FROM dual);
결과 :
| phone_number | phone_status |
|--------------|--------------|
| 123-456-7890 | Valid |
| 123-45-7890 | Invalid |
REGEXP_COUNT
- 정규 표현식을 사용하여 문자열 내에서 특정 패턴의 발생 횟수를 계산하는 데 사용
# 문법
REGEXP_COUNT(source_string, pattern, position, match_parameter)
- source_string : 검색할 문자열
- pattern : 검색할 패턴을 정의하는 정규 표현식
- position : 검색을 시작할 위치. 기본값은 1
- match_parameter : 일치 조건을 지정하는 선택적 매개변수 (예: 'i'는 대소문자 구분 없음).
# 예시
# 문자열에서 특정 단어의 발생 횟수 계산
SELECT REGEXP_COUNT('Hello World, Welcome to the World of SQL', 'World') AS occurrence_count
FROM dual;
결과 :
2
# 특정 위치부터 패턴 검색
# 다음 쿼리는 문자열 'ababab'에서 'ab' 패턴이 처음부터가 아닌 3번째 위치부터 몇 번 등장하는지 계산
SELECT REGEXP_COUNT('ababab', 'ab', 3) AS occurrence_count
FROM dual;
결과 :
1
'데이터베이스(DB) > SQLD' 카테고리의 다른 글
[SQLD 2-3-2] 관리 구문 - TCL (29) | 2024.06.20 |
---|---|
[SQLD 2-3-1] 관리 구문 - DML (29) | 2024.06.18 |
[SQLD 2-2-7] SQL 활용 - PIVOT 절과 UNPIVOT 절 (33) | 2024.06.15 |
[SQLD 2-2-6] SQL 활용 - 계층형 질의와 셀프 조인 (2) | 2024.06.14 |
[SQLD 2-2-5] SQL 활용 - Top N 쿼리 (31) | 2024.06.13 |