2017-03-20 9 views

答えて

0

おそらくこのようなものです。それを分解する:

最初に文字列をコンポーネントトークンに分解し、LISTAGG()を使用してそれらをアルファベット順に並べ替える必要があります。

記号で区切られた文字列を分割する方法はたくさんあります。ここでは、階層的なクエリの使用方法を示します。入力文字列を互いに一意に区別する必要があります。正確に同じセミコロンで区切られた文字列が複数回出現する可能性があるため、OP内の他の一意の列に関する情報がテーブルにないため、最も深くネストされたサブクエリで一意の識別子(ROW_NUMBER()を使用)を作成します。次に、階層的なクエリを実行して入力を分割し、最も外側のSELECTで再構成します。

with 
    test_data as (
     select 'abc;pqr;def;mno' as str from dual union all 
     select 'xyz;pqr;abc'   from dual union all   
     select 'abc'     from dual union all 
     select 'xyz;jkl'    from dual 
    ) 
-- End of test data (not part of the solution!) 
-- SQL query begins BELOW THIS LINE. 
select str, 
     listagg(token, ';') within group (order by token) as sorted_str 
from (
     select rn, str, 
       regexp_substr(str, '([^;]*)(;|$)', 1, level, null, 1) as token 
     from (
        select str, row_number() over (order by null) as rn 
        from test_data 
       ) 
     connect by level <= length(str) - length(replace(str, ';')) + 1 
       and prior rn = rn 
       and prior sys_guid() is not null 
     ) 
group by rn, str 
; 

STR    SORTED_STR 
--------------- --------------- 
abc;pqr;def;mno abc;def;mno;pqr 
xyz;pqr;abc  abc;pqr;xyz 
abc    abc 
xyz;jkl   jkl;xyz 

4 rows selected. 
関連する問題