【问题标题】:How to group distinct comma separated values in Oracle如何在 Oracle 中对不同的逗号分隔值进行分组
【发布时间】:2017-11-22 21:49:08
【问题描述】:

我的 main_mappings 表包含这样的数据:

mid  sid
1    1,2,3
1    2,4
3    1
4    2
4    5,9

我想得到这个:

mid  sids
1    1,2,3,4
3    1
4    2,5,9

我试过这个:

select mid, listagg(sid, ',') within group   (order by sid)
from main_mappings group by mid;

但它给了我这个:

1    1,2,3,2,4
3    1
4    2,5,9

有人可以帮忙吗?

【问题讨论】:

  • 修复您的数据结构,这样您就不会将值存储为逗号分隔的列表。

标签: sql oracle


【解决方案1】:

您应该规范化您的表格,以便将每个值存储在不同的行中。 对于这种情况,你可以利用嵌套表为每个csv值生成行,找到不同的行,然后listagg就可以了。

select mid, listagg(sid, ',') within group(order by sid) sids
from (
select distinct m.mid, x.column_value sid
from main_mappings m,
table(
  cast (
    multiset(
      select regexp_substr(m.sid,'[^,]+',1,level)
      from dual
      connect by level <= regexp_count(m.sid,',') + 1
    )
  as sys.odcinumberlist)
)x )
group by mid;

【讨论】:

    【解决方案2】:

    您可以尝试以下解决方案。

    SELECT listagg(ra,',')  WITHIN GROUP (ORDER BY ra)
    FROM
    (
    SELECT DISTINCT (REGEXP_SUBSTR('02,02,02,02,02,03,04,03', '[^,]+', 1, LEVEL) )ra
            FROM DUAL
          CONNECT BY REGEXP_SUBSTR('02,02,02,02,02,03,04,03', '[^,]+', 1, LEVEL) IS NOT NULL
    )
    

    【讨论】:

      猜你喜欢
      • 2016-04-18
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      • 2015-04-01
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多