strQry = '
UPDATE "CL_COMPANY"
SET "CO_ADDR1" = RegExp_Replace("CO_ADDR1", \'^(.*?)(특별시|광역시|특별자치시|특별자치도|시|도)\', \'\1\')
, "CO_ADDR" = RegExp_Replace("CO_ADDR" , \'^(.*?)(특별시|광역시|특별자치시|특별자치도|시|도)\', \'\1\')
WHERE "CO_PK" = :coPk:
';
"CO_ADDR"가 경기 남양주시 진접읍 광릉내로 60인 경우
띄어쓰기로 구분해서 첫번째 문자열만 정규표현식이 적용되게 수정해 줘
제시해주신 쿼리는 주소 전체에서 패턴을 찾으려 하기 때문에 의도치 않은 부분까지 치환될 위험이 있습니다.
주소 문자열을 공백(Space) 기준으로 잘라 첫 번째 단어만 정규식으로 가공한 뒤, 다시 나머지 주소와 합치는 방식의 SQL 문법으로 수정해 드립니다. (PostgreSQL 환경을 기준으로 작성되었습니다.)
UPDATE "CL_COMPANY"
SET
-- 1. Split_Part로 첫 단어만 추출
-- 2. 추출된 단어에서 행정구역 명칭 제거
-- 3. 나머지 주소와 다시 결합 (선택 사항에 따라 조절)
"CO_ADDR1" = RegExp_Replace(Split_Part("CO_ADDR1", ' ', 1), '(특별시|광역시|특별자치시|특별자치도|시|도)$', ''),
"CO_ADDR" = RegExp_Replace(Split_Part("CO_ADDR", ' ', 1), '(특별시|광역시|특별자치시|특별자치도|시|도)$', '')
|| Substring("CO_ADDR" FROM ' .*') -- 첫 단어 이후의 나머지 주소를 다시 붙임
WHERE "CO_PK" = :coPk:;
주요 수정 및 개선 사항
Split_Part("컬럼", ' ', 1)사용:- 공백을 기준으로 문자열을 나누고 그중 첫 번째(1) 문자열(예: "경기도", "경기")만 가져옵니다.
- 이렇게 하면 "진접읍"이나 "남양주시"처럼 뒤에 나오는 단어들이 정규식에 걸려 파손되는 것을 원천 봉쇄할 수 있습니다.
- 정규식 패턴 수정 (
$):- 패턴 뒤에
$를 붙여 단어의 끝에 해당 명칭이 올 때만 치환하도록 제한했습니다. - 이 처리를 하지 않으면 "시흥시" 같은 경우 앞의 "시"가 지워질 수 있는데, 이를 방지해줍니다.
- 패턴 뒤에
- 결합 연산자 (
||):CO_ADDR의 경우 첫 단어만 바꾸고 나머지 상세 주소는 보존해야 하므로,Substring을 이용해 첫 공백 이후의 문자열을 다시 붙여주었습니다.