2016-09-20 7 views
0

ich folgende Zeichenfolge haben:Regulärer Ausdruck zu Duplikate aus Komma entfernen getrennte Zeichenfolge

'C,2,1,2,3,1' 

Ich brauche einen regulären Ausdruck Duplikate zu entfernen und das Ergebnis Zeichenfolge wie folgt sein sollte:

'C,2,1,3' 
+2

I Ich bin mir nicht sicher, ob ein normaler Ausdruck der richtige Weg ist. Was hast du probiert? Und welche Sprache benutzt du? (Sie erwähnen Oracle. Bedeutet dies, dass Sie versuchen, dies in SQL zu tun?) – dave

+0

ja, in SQL Select-Anweisung – JanithOCoder

+1

Ich vermute, das ist sehr schwierig in SQL. Es wäre viel einfacher, diese Spalte abzurufen und nachzubearbeiten. Wenn Sie uns mehr Informationen zeigen und was Sie versucht haben, kann dies helfen (und die Downvotes stoppen). – dave

Antwort

1

Wenn Ihr Eingabedaten sind mehr als eine Zeichenfolge, ich nehme an, dass es eine Art von ID-Spalte gibt, die Sie verwenden können, um die Zeichenfolgen voneinander zu unterscheiden. Wenn keine solche Spalte vorhanden ist, kann sie in der ersten faktorisierten Unterabfrage erstellt werden, z. B. mit rownum.

with 
    inputs (id, str) as (
     select 1, 'C,2,1,2,3,1' from dual union all 
     select 2, 'A,ZZ,3,A,3,ZZ' from dual 
    ), 
    unwrapped (id, str, lvl, token) as (
     select id, str, level, regexp_substr(str, '[^,]+', 1, level) 
     from inputs 
     connect by level <= 1 + regexp_count(str, ',') 
      and prior id = id 
      and prior sys_guid() is not null 
    ), 
    with_rn (id, str, lvl, token, rn) as (
     select id, str, lvl, token, row_number() over (partition by id, token order by lvl) 
     from unwrapped 
    ) 
select id, str, listagg(token, ',') within group (order by lvl) as new_str 
from with_rn 
where rn = 1 
group by id, str 
order by id 
; 


    ID STR    NEW_STR 
---- ------------------ -------------------- 
    1 C,2,1,2,3,1  C,2,1,3 
    2 A,ZZ,3,A,3,ZZ  A,ZZ,3 
0

Try this:

with 
    -- your input data 
    t_in as (select 'C,2,1,2,3,1' as s from dual), 
    -- your string splitted into a table, a row per list item 
    t_split as (
     select (regexp_substr(s,'(\w+)(,|$)',1,rownum,'c',1)) s, 
       level n 
     from t_in 
     connect by level <= regexp_count(s,'(\w+)(,|$)') + 1 
    ), 
    -- this table grouped to obtain distinct values with 
    -- minimum levels for sorting 
    t_grouped as (
     select s, min(n) n from t_split group by s 
    ) 
select listagg(s, ',') within group (order by n) 
from t_grouped; 

auf Ihrem Oracle-Version Abhängig Sie könnten listagg mit wm_concat ersetzen müssen (es ist googlable)

+0

Diese ex gibt eine falsche Ausgabe mit "2, CAA, 2,1,2,3,1" und ändert sich in 'regexp_substr (s,' (\ w +) (, | $) ', 1, rownum,' c ', 1) 'kann helfen –

+0

@Evgeniy K., danke, es hilft. Wie auch immer, die vorherige Syntax funktionierte auch für mich. –

+0

Oh, ich war blind, tut mir leid. Es wurde trotzdem behoben. Vielen Dank. –

0

Hier ist eine andere kürzere Lösung:

select listagg(val, ',') within group(order by min(id)) 
    from (select rownum as id, 
       trim(regexp_substr(str, '[^,]+', 1, level)) as val 
      from (select 'C,2,1,2,3,1' as str from dual) 
     connect by regexp_substr(str, '[^,]+', 1, level) is not null) 
group by val; 
Verwandte Themen