행단위(row)로되어있는 데이터는
distinct 한방으로 해결되는데, 그림처럼
한 열(colume)에 구분자로 되어있는 데이터의 중복을
제거한다는건 참 지랄 리스틱하다.
인터넷을 뒤져봤는데, 잘 나오지도 않고
어떻게 찾은 프로시저 예제를 봤으나 컴파일에러?!
그래서 로직상 성능은 고려되지 않은 구현을 위한 코드가 완성되었다 -_-;
일단 오라클에서 split하는 펑션은
http://tost.tistory.com/53
에 적어두었다... 그걸 호출해서 가공하는것이니 참고하시길...
참고로 제약사항도 많다.... 사실 PL-SQL(?)문에 대해 잘 모르다보니 일어나는 문제라고 하겠지만 ;;;;
어쩔수없다...
우선 제약사항 및 참고사항
(1) 구분자는 , 로 구현한 소스
(2) 구분자로 구분된 데이터는 최대 100개만 지원함
[코드]
create or replace
FUNCTION FN_JMC_SPLIT2 (str IN VARCHAR)
RETURN CHAR IS
v_result varchar(4000);
tmpstr varchar(500);
idx NUMBER(10);
type my_varry_type is varray(100) of VARCHAR2(500); -- varray 타입 정의
syndata my_varry_type := my_varry_type('','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','''','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');
i integer;
j integer;
k integer;
chk integer;
BEGIN
v_result := '';
idx := 1;
tmpstr := FN_JMC_SPLIT(str, ',', idx); -- 구분자는 여기서 변경이 가능하다
i := 0;
j := 0;
k := 0;
chk := 0;
while (tmpstr is not null)
loop
syndata(idx) := tmpstr;
idx := idx+1;
tmpstr := FN_JMC_SPLIT(str, ',', idx); -- 구분자는 여기서 변경이 가능하다
end loop;
for i IN 1..idx
LOOP
chk := 1;
k := i + 1;
IF k > idx THEN
chk := 0;
END IF;
for j IN k..idx
LOOP
IF syndata(i) = syndata(j) THEN
chk:=0;
END IF;
end loop;
IF chk = 1 THEN
v_result := v_result || ',' || syndata(i); -- 구분자는 여기서 변경이 가능하다
END IF;
END loop;
RETURN substr(v_result,2,length(v_result));
END FN_JMC_SPLIT2;
[사용법]
select 필드명1, FN_JMC_SPLIT2(필드명2) from 테이블명;
중간에 보면... 소스가 비효율적인걸 확인할 수 있겠지만,,,
현재 실력으로는 이게 한계 ;;
distinct 한방으로 해결되는데, 그림처럼
한 열(colume)에 구분자로 되어있는 데이터의 중복을
제거한다는건 참 지랄 리스틱하다.
인터넷을 뒤져봤는데, 잘 나오지도 않고
어떻게 찾은 프로시저 예제를 봤으나 컴파일에러?!
그래서 로직상 성능은 고려되지 않은 구현을 위한 코드가 완성되었다 -_-;
일단 오라클에서 split하는 펑션은
http://tost.tistory.com/53
에 적어두었다... 그걸 호출해서 가공하는것이니 참고하시길...
참고로 제약사항도 많다.... 사실 PL-SQL(?)문에 대해 잘 모르다보니 일어나는 문제라고 하겠지만 ;;;;
어쩔수없다...
우선 제약사항 및 참고사항
(1) 구분자는 , 로 구현한 소스
(2) 구분자로 구분된 데이터는 최대 100개만 지원함
[코드]
create or replace
FUNCTION FN_JMC_SPLIT2 (str IN VARCHAR)
RETURN CHAR IS
v_result varchar(4000);
tmpstr varchar(500);
idx NUMBER(10);
type my_varry_type is varray(100) of VARCHAR2(500); -- varray 타입 정의
syndata my_varry_type := my_varry_type('','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','''','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','');
i integer;
j integer;
k integer;
chk integer;
BEGIN
v_result := '';
idx := 1;
tmpstr := FN_JMC_SPLIT(str, ',', idx); -- 구분자는 여기서 변경이 가능하다
i := 0;
j := 0;
k := 0;
chk := 0;
while (tmpstr is not null)
loop
syndata(idx) := tmpstr;
idx := idx+1;
tmpstr := FN_JMC_SPLIT(str, ',', idx); -- 구분자는 여기서 변경이 가능하다
end loop;
for i IN 1..idx
LOOP
chk := 1;
k := i + 1;
IF k > idx THEN
chk := 0;
END IF;
for j IN k..idx
LOOP
IF syndata(i) = syndata(j) THEN
chk:=0;
END IF;
end loop;
IF chk = 1 THEN
v_result := v_result || ',' || syndata(i); -- 구분자는 여기서 변경이 가능하다
END IF;
END loop;
RETURN substr(v_result,2,length(v_result));
END FN_JMC_SPLIT2;
[사용법]
select 필드명1, FN_JMC_SPLIT2(필드명2) from 테이블명;
중간에 보면... 소스가 비효율적인걸 확인할 수 있겠지만,,,
현재 실력으로는 이게 한계 ;;