-1
列内の行ごとにセミコロンで区切られた値を並べ替える必要があります。例えば。セミコロンで区切られた列の行ごとに区切られた値
Input:
abc;pqr;def;mno
xyz;pqr;abc
abc
xyz;jkl
Output:
abc;def;mno;pqr
abc;pqr;xyz
abc
jkl;xyz
誰でも手助けできますか?
列内の行ごとにセミコロンで区切られた値を並べ替える必要があります。例えば。セミコロンで区切られた列の行ごとに区切られた値
Input:
abc;pqr;def;mno
xyz;pqr;abc
abc
xyz;jkl
Output:
abc;def;mno;pqr
abc;pqr;xyz
abc
jkl;xyz
誰でも手助けできますか?
おそらくこのようなものです。それを分解する:
最初に文字列をコンポーネントトークンに分解し、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.