문자열 교체(regexp_replace)
regexp_replace(source, pattern, replacement_string, flag)
source
: 원본 데이터pattern
: 찾을 패턴replacement_string
: 변경할 내용flag
g
: 전체 데이터 범위를 Replace- 생략: 첫번째 발견한 데이터 1개만 replace 예시)
select regexp_replace('A1B2C3', '[0-9]', '', 'g');
: ABC- 숫자에 해당하는 문자열 전체 공백으로 변경
select regexp_replace('A1B2C3', '[0-9]', '');
AB2C3- 숫자에 해당하는 첫번째 문자열만 공백으로 변경
select regexp_replace('A1B2C3', '[^0-9]', '', 'g');
- 문자에 해당하는 문자열 전체를 공백으로 변경
select regexp_replace('A1B2C3', '[^0-9]', '');
- 문자에 해당하는 첫번째 문자열만 공백으로 변경
select regexp_replace('산508-1대', '[ㄱ-ㅣ가-힣]', '', 'g')
select regexp_replace('산508-1대', '[ㄱ-ㅣ가-힣]', '', 'g')
select regexp_replace('A1B2C3', '[0-9]', '', 'g');
select regexp_replace('A1B2C3', '[^0-9]', '', 'g');
select regexp_replace('A1B2C3', '[0-9]', '');
select regexp_replace('A1B2C3', '[^0-9]', '');
자주 쓰는 정규식
-- 숫자를 전부 특정 문자로 변경 ( 중간에 .이 들어간 소수는 뒷자리 변경안됨 )
select regexp_replace([컬럼명], '[[:digit:]]+', [변경값]) from [테이블명];
-- 숫자를 제외한 모든(문자/특수문자)를 제거
select regexp_replace([컬럼명], '\D', [변경값], 'g') from [테이블명];
-- 특수문자 제거
SELECT regexp_replace([컬럼명], '[^a-zA-Z]', '') FROM [테이블명];
문자열 추출(regexp_substr)
regexp_substr(string, pattern)
select regexp_substr('서울특별시 관악구 낙성대동 247-5', '[^ ]+시 [^ ]+구|[^ ]*군');
: 서울특별시 관악구select regexp_substr('경상북도 예천군 호명읍 복대리 425-2', '[^ ]+시 [^ ]+구|[^ ]*군');
: 예천군
지번주소를 활용한 시도/시군구/읍면/동리/본번/부번 구분
시군구 주의점
- 시도가 ‘도’일 경우에는 시 구 또는 군 추출
- 예) 경기도 부천시 소사구 > 부천시 소사구
- 예) 경상북도 예천군 호명읍 > 예천군
- 시도가 ‘시’일 경우에는 구 또는 군
- 예) 서울특별시 종로구 > 종로구
- postgresql
- 시군구, 지번 적용유의
split_part(string, pattern, n)
: 패턴으로 구분했을 때, n번째 등장하는 문자열- 지번
- pnu 기준 4자리 0으로 채울지에 따라 다름
lpad(a_string, n, b_string)
: a_string을 n자리로 만들며, 앞에 string으로 채움- 예)
lpad('23', 4, '0')
>0023
- 예)
- 위와 같은 경우,
-
기준으로 분리한 후lpad
함수를 통해
select regexp_substr(address, '[^ ]+시|[^ ]+도')
as sido_name,
case
when regexp_substr(split_part(address, ' ', 1), '[^ ]+시') is not null
then regexp_substr(address, '[^ ]+구')
when regexp_substr(split_part(address, ' ', 1), '[^ ]+도') is not null
then regexp_substr(address, '[^ ]+시 [^ ]+구|[^ ]+군')
end as sigungu_name,
regexp_substr(address, '[^ ]+읍|[^ ]+면')
as upmyun_name,
regexp_substr(address, '[^ ]+동|[^ ]+리|[^ ]+가|[^ ]+로')
as dongri_name,
split_part(regexp_substr(address, '\d+-\d+'), '-', 1)
as bunji1,
lpad(split_part(regexp_replace(address, '[^-0-9]', '', 'g'), '-', 1), 4,'0')
as bunji1_fill,
split_part(regexp_substr(address, '\d+-\d+'), '-', 2)
as bunji2,
lpad(split_part(regexp_replace(address, '[^-0-9]', '', 'g'), '-', 2), 4,'0')
as bunji2_fill
from table
- mysql
substring_index(string, pattern, n)
: 패턴으로 구분했을 때, n번째 등장하는 문자열
select regexp_substr(address, '[^ ]+시|[^ ]+도')
as sido_name,
case
when regexp_substr(substring_index(address, ' ', 1), '[^ ]+시') is not null
then regexp_substr(address, '[^ ]+구')
when regexp_substr(substring_index(address, ' ', 1), '[^ ]+도') is not null
then regexp_substr(address, '[^ ]+시 [^ ]+구|[^ ]+군')
end as sigungu_name,
regexp_substr(address, '[^ ]+읍|[^ ]+면')
as upmyun_name,
regexp_substr(address, '[^ ]+동|[^ ]+리')
as dongri_name
from table
특정문자 채우기(LAPD)
select lpad()
특정 문자 앞 자르기(regexp_split_to_array)
활용방법
특정 문자를 기준으로 문자열을 분리할 때 사용 예) ‘서울특별시 관악구 신림동 611-171번지 푸르미르빌 402호’ 지번 주소를 ‘번지’를 기준으로 앞 뒤 자르기 결과) 서울특별시 관악구 신림동 611-171, 푸르미르빌 402호 단, 번지 뒤에 공백이 있음!
select regexp_split_to_array('서울특별시 관악구 신림동 611-171번지 푸르미르빌 402호', '번지')
# 번지 앞 부분 가져오기
select (regexp_split_to_array('서울특별시 관악구 신림동 611-171번지 푸르미르빌 402호', '번지'))[1]
# 번지 뒷 부분 가져오기
select (regexp_split_to_array('서울특별시 관악구 신림동 611-171번지 푸르미르빌 402호', '번지'))[2]
# 앞 뒤 공백 제거
select trim((regexp_split_to_array('서울특별시 관악구 신림동 611-171번지 푸르미르빌 402호', '번지'))[2])