0

私は持っている

 POW,POW,POWPRO,PRO,PRO,PROUTL,TNEUTL,TNEUTL,UTL,UTLTNE,UTL,UTLTNE

私が欲しい

POW,POWPRO,PRO,PROUTL,TNEUTL,UTL,UTLTNE

私は試した

select regexp_replace('POW,POW,POWPRO,PRO,PRO,PROUTL,TNEUTL,TNEUTL,UTL,UTLTNE,UTL,UTLTNE','([^,]+)(,\1)+','\1') from dual

そして、私は出力を取得します

 POWPROUTL,TNEUTL,UTLTNE,UTLTNE

しかし、私は出力が

POW,POWPRO,PRO,PROUTL,TNEUTL,UTL,UTLTNE

助けてください。

4

2 に答える 2

0

以下に示すソリューションでは、ストレート SQL (PL/SQL なし) を使用します。考えられるすべての入力文字列で機能し、重複を適切に削除します。入力トークンの順序は、その順序が何であれ維持されます。また、ヌル入力を正しく処理しながら、連続するコンマを削除します (入力文字列から「ヌルを削除」します)。コンマのみで構成される入力文字列の出力と、それぞれ 2 つのスペースと 1 つのスペースで構成される「トークン」の正しい処理に注意してください。

クエリは比較的ゆっくりと実行されます。パフォーマンスが問題になる場合は、正規表現よりもかなり高速な「従来型」substrを使用して、再帰クエリとして書き直すことができます。instr

with inputs (input_string) as (
       select 'POW,POW,POWPRO,PRO,PRO,PROUTL,TNEUTL,TNEUTL,UTL,UTLTNE,UTL,UTLTNE' from dual
       union all
       select null from dual
       union all
       select 'ab,ab,st,ab,st,  , ,  ,x,,,r' from dual
       union all
       select ',,,' from dual
     ),
     tokens (input_string, rk, token) as (
       select     input_string, level, 
                  regexp_substr(input_string, '([^,]+)', 1, level, null, 1)
       from       inputs 
       connect by level <= 1 + regexp_count(input_string, ',')
     ),
     distinct_tokens (input_string, rk, token) as (
       select     input_string, min(rk) as rk, token
       from       tokens
       group by   input_string, token
     )
select   input_string, listagg(token, ',') within group (order by rk) output_string
from     distinct_tokens
group by input_string
;

作成した入力の結果:

INPUT_STRING                                                       OUTPUT_STRING
------------------------------------------------------------------ ----------------------------------------
,,,                                                                (null)
POW,POW,POWPRO,PRO,PRO,PROUTL,TNEUTL,TNEUTL,UTL,UTLTNE,UTL,UTLTNE  POW,POWPRO,PRO,PROUTL,TNEUTL,UTL,UTLTNE
ab,ab,st,ab,st,  , ,  ,x,,,r                                       ab,st,  , ,x,r
(null)                                                             (null)


4 rows selected.
于 2016-06-23T22:43:59.480 に答える