regexp_replace 중복제거 1 3 8,055

by 알렌 [Oracle 기초] 정규식 regexp_replace 중복제거 [2021.03.23 11:35:34]


 

안녕하세요. 

,(콤마)로 구분된 아래 데이터의 중복을 제거할려고 하는데요. 

아래와 같이 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

by 마농 [2021.03.23 12:51:44]

연속된 것만 제거가 되고(불연속 제거 안됨)(예 : 2,1,2 에서 2가 중복이지만 제거 안됨)
잘못된 결과가 나올 수도 있고(2.1 의 경우 2 와 중복이 아님)
위 방법은 숫자의 자리수가 동일하고 연속인 중복만 제거가 됩니다.
따라서 중복제거의 올바른 사용법은 아니라고 생각됩니다.

정규식 의미
[^,] 컴마가 이닌 문자
+ 1번 이상 반복
* 0번 이상 반복
\1 첫번째 괄호
| 또는
$ 끝


by 알렌 [2021.03.24 13:21:05]

상세한 답변 감사합니다. 

숫자 여러개 항목에서 중복제거하는 위의 예시는 적절치 않았던 것 같구요. 

숫자 여러개 항목이 아닌 두개 문자열 항목에 대해서 같으면 중복제거를 할려고 합니다. 

그런데 해당 정규식을 활용하여 돌렸을때 , 아래와 같은 상황이 발생해서 이해가 되지 않아 문의드렸던 내용입니다. 

 

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번 이상 반복된 첫 문자열) (또는 끝문자열에 대해서) (첫 문자열로 대체하라?)

 

이렇게 해석하는게 맞을까요?  바쁘신데, 먼저 감사 말씀드립니다.  


by 마농 [2021.03.25 02:02:40]

사용된 정규식은 목적도 다르고, 정확하지도 않습니다.
잘못된 정규식을 억지로 이해하려고 애쓰지 마세요.
지금의 목적은 원래의 복잡한 목적보다 훨씬 간단하여 구현하기도 수월합니다.
^ 는 대괄호 안에서는 부정의 의미지만 대괄호 밖에서는 시작을 의미합니다.
 

WITH t AS
(
SELECT 'ABCD,DBCD' v FROM dual
UNION ALL SELECT 'ABCD,ABCD' FROM dual
)
SELECT v
     , REGEXP_REPLACE(v, '^([^,]+),\1$', '\1') x
  FROM t
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입