행단위(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 테이블명;



중간에 보면... 소스가 비효율적인걸 확인할 수 있겠지만,,,
현재 실력으로는 이게 한계 ;;

+ Recent posts