[PostgreSQL] 문자열내 중복 공백, 단어 제거

1. 중복 공백 제거

특정 문자열에 대해서 중복 공백 제거를 하고 싶다면 postgresql 정규식을 사용해서 가능하다.
(공백 외에 단일 문자에 대한 중복제거도 동일한 방법으로 가능하다.)
select regexp_replace(name, ' +', ' ', 'g') from TABLE; -- 'g' 옵션을 제거할 경우 최초 건에 대에서만 변경

2. 중복 단어 제거

컬럼 단위 중복제거는 distinct, group by를 통해 쉽게 가능하지만, 컬럼 내 문자열의 중복 단어 제거의 경우 다음과 같다.
(쉼표 기준으로 컬럼을 분리, 중복을 제거한 후 다시 연결)
select id, array_to_string(array_agg(distinct token), ' ') from (
SELECT unnest(string_to_array(COLUMN, ' ')) as token, id FROM TABLE) as tmp
group by id

3. 실습

3-1. 테이블 생성

-- 테스트 테이블 생성
create table duplicate_test (
    id serial primary key,
    name varchar(255) not null
);

3-2. 테스트 데이터 insert

 

-- 테스트 데이터 입력
insert into duplicate_test
(name)
values
('서울  서울    대구 서울 부산'),
('서울 서울 대구     서울'),
('부산 대구 대구 서울   서울서울 서울 광주'),
('서울 에서 대구   갔다가 부산 거쳐 다시   서울 로'),
('광주광주대구 대구 대   구 서울  '),
('서울 서울 서울 '),
('서울 대구 대   구 서울  '),
('서울 대구 대구 대   구 서울  '),
('서울 대구    대구 대구 부산부산 서울 부산 서울부 산')
;

3-3. 중복 공백 제거

select regexp_replace(name, ' +', ' ', 'g') from DUPLICATE_TEST; -- 'g' 옵션을 제거할 경우 최초 건에 대에서만 변경

select regexp_replace(name, '단일문자열+', ' ', 'g') from DUPLICATE_TEST; -- 단일문자열에 대한 중복 제거도 동일한 방법으로 가능하다.

 

3-4. 중복 단어 제거

select id, array_to_string(array_agg(distinct token), ' ') from (
SELECT unnest(string_to_array(name, ' ')) as token, id FROM DUPLICATE_TEST) as tmp
group by id