SQL example using wm_concat function:
- select wm_concat(distinct keyword) keywords
- from (
- SELECT LEVEL AS keyword_no
- , REGEXP_SUBSTR(keywords, '[^,]+', 1, LEVEL) AS keyword
- --, str
- FROM (
- SELECT ROWNUM AS id
- , 'SCOTT,ALLEN,KING,SCOTT,12345,SCOTT,12345,ALLEN,SCOTT' as keywords
- FROM dual
- )
- CONNECT BY
- -- INSTR for compatibility with Oracle 10g
- --INSTR(keywords, ',', 1, LEVEL-1) > 0
- -- From Oracle 11g may used regexp_count
- LEVEL <= regexp_count(keywords,',') + 1
- AND id = PRIOR id
- AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL
- )
- ;
-
- KEYWORDS
- --------------------------------------------
- 12345,ALLEN,KING,SCOTT
- 1 row selected.
-
SQL example using listagg function:
- select listagg(keyword, ',') WITHIN GROUP (ORDER BY keyword) keywords
- from (
- select distinct keyword
- from (
- SELECT LEVEL AS keyword_no
- , REGEXP_SUBSTR(keywords, '[^,]+', 1, LEVEL) AS keyword
- --, str
- FROM (
- SELECT ROWNUM AS id
- , 'SCOTT,ALLEN,KING,SCOTT,12345,SCOTT,12345,ALLEN,SCOTT' as keywords
- FROM dual
- )
- CONNECT BY
- -- INSTR for compatibility with Oracle 10g
- --INSTR(keywords, ',', 1, LEVEL-1) > 0
- -- From Oracle 11g may used regexp_count
- LEVEL <= regexp_count(keywords,',') + 1
- AND id = PRIOR id
- AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL
- )
- )
- ;
-
- KEYWORDS
- --------------------------------------------------------------------------------
- 12345,ALLEN,KING,SCOTT
- 1 row selected.
Using PL/SQL function example:
- DECLARE
- l_keywords varchar2(32767) := '10,20,30,40, 10, 20,SCOTT,ALLEN,KING,SCOTT,12345,SCOTT,12345,ALLEN,SCOTT';
-
- function extract_duplicate_keywords(p_keywords varchar2) return varchar2
- is
- l_result varchar2(32767);
- cnt pls_integer;
-
- --l_str varchar2(4000);
- TYPE nested_nbr_type IS TABLE OF varchar2(4000);
- nnt2 nested_nbr_type := nested_nbr_type();
- --nnt3 nested_nbr_type;
- answer nested_nbr_type;
- j pls_integer;
- BEGIN
- nnt2 := nested_nbr_type();
-
- cnt := regexp_count(p_keywords, '[^,]+');
- --dbms_output.put_line('Count: ' || cnt);
- for i in 1 .. cnt + 1
- loop
- nnt2.extend;
- nnt2(nnt2.last) := trim(REGEXP_SUBSTR(p_keywords,'[^,]+', 1, i));
- --dbms_output.put_line(i || ': ' || l_str);
- end loop;
- --nnt3 := nnt2;
- answer := nnt2 MULTISET INTERSECT DISTINCT nnt2;
-
- j := answer.first;
- while j is not null
- loop
- if answer(j) is not null then
- l_result := l_result || ',' ||answer(j);
- --dbms_output.put_line(answer(j));
- end if;
- j := answer.next(j);
- end loop;
- return ltrim(l_result, ',');
- END;
- BEGIN
- l_keywords := extract_duplicate_keywords(l_keywords);
- dbms_output.put_line(l_keywords);
- END;