使用(Oracle)SQL对字符串中的分隔分隔值进行排序

时间:2011-10-18 13:53:06

标签: string oracle sorting plsql oracle10g

说你有

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中。

2 个答案:

答案 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