안녕하세요.
,(콤마)로 구분된 아래 데이터의 중복을 제거할려고 하는데요.
아래와 같이 2가지 방법이 있습니다.
첫번째 방법에서는 중복제거는 되었지만, 2가 제외되었고,
두번째 방법에서는 모두 표현이 되었는데요.
어떤 원리로 중복제거가 되는지 알려주실수 있을까요?
구글링과 책을 찾아봤지만, 명쾌한 답을 찾을 수 없어 구루비에 문의드려요.
감사합니다.
-- 첫번째
select regexp_replace('2,2,2.1,3,3,3,3,4,4', '([^,]+)(,\1)+', '\1') as test1
from dual
TEST1
2.1,3,4
;
-- 두번째
select regexp_replace('2,2,2.1,3,3,3,3,4,4', '([^,]+)(,\1)*(,|$)', '\1\3') as test2
from dual
TEST2
2,2.1,3,4
관련 정보 사이트 주소 :
https://stackoverflow.com/questions/11510870/listagg-in-oracle-to-return-distinct-values
상세한 답변 감사합니다.
숫자 여러개 항목에서 중복제거하는 위의 예시는 적절치 않았던 것 같구요.
숫자 여러개 항목이 아닌 두개 문자열 항목에 대해서 같으면 중복제거를 할려고 합니다.
그런데 해당 정규식을 활용하여 돌렸을때 , 아래와 같은 상황이 발생해서 이해가 되지 않아 문의드렸던 내용입니다.
select regexp_replace('ABCD,DBCD', '([^,]+)(,\1)+', '\1') as test1
from dual
TEST1
ABCDBCD
;
select regexp_replace('ABCD,DBCD', '([^,]+)(,\1)*(,|$)', '\1\3') as test2
from dual
TEST2
ABCD,DBCD
첫번째 정규식을 해석해보면, regexp_replace( '문자열1,문자열2', '([^,]+)(,\1)+', '\1')
(콤마가 아닌 연속된 문자열에서) (1번 이상 반복된 첫문자열에 대해서) (첫문자열로 대체하라)
두번째 정규식을 해석해보면, regexp_replace( '문자열1,문자열2', '([^,]+)(,\1)*(,|$)', '\1\3')
(콤마가 아닌 연속된 문자열에서) (0번 이상 반복된 첫 문자열) (또는 끝문자열에 대해서) (첫 문자열로 대체하라?)
이렇게 해석하는게 맞을까요? 바쁘신데, 먼저 감사 말씀드립니다.