以下に示すソリューションでは、ストレート 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.