说你有
select '9|2|6|7|5' as somedata from dual
有没有办法可以做类似的事情:
select
in_string_sort('|', a.somedata)
from
(select '9|2|6|7|5' as somedata from dual) a
结果是'2|5|6|7|9'
?
我知道,我可以使用一个函数来实现它,但这是如此基本我想知道Oracle是否会为这类事情提供一些内置函数。
[编辑] 忘了提及:这将在Oracle 10gR2中。
答案 0 :(得分:6)
据我所知,没有这样的内置功能。你没有说哪个版本,所以我假设11g。此查询应该为您完成:
1 select listagg(somedata, '|') within group (order by somedata) somedata from (
2 with q as (select '|'||'9|2|6|7|5' as somedata from dual)
3 select substr(somedata, instr(somedata, '|', 1, rownum) + 1, 1) somedata
4 from q,
5 (select 1 from q connect by level <= length(regexp_replace(somedata, '[0-9]', '')))
6* )
SOMEDATA
------------------------------
2|5|6|7|9
答案 1 :(得分:2)
这是一个较旧的问题,但我跑过去搜索我的特定问题的解决方案。 RichardJQ的答案很好,但它只适用于单个字段(长度为1)和数字。此外,我想简化解决方案,以使用较新版本的Oracle中提供的regexp功能。以下代码段适用于具有任何字符长度和字母数字值的字段。此解决方案适用于11g或更新版本。
select listagg(somedata, '|') within group (order by somedata) somedata from (
with q as (select '|'||'bbb|aaa|99|9|2|6|7|5' as somedata from dual)
select
regexp_substr(somedata, '\|([^|]+)',1,rownum,'i',1) somedata
from q,
(select 1 from q connect by level <= length(regexp_replace(somedata, '[^|]', '')))
)
SOMEDATA
------------------------------
2|5|6|7|9|99|aaa|bbb