• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Oracle listagg,wm_concat函数行转列结果去重Oracle 11g/19c版本

武飞扬头像
SUMMERENT
帮助5

1、准备数据表

学新通

2、根据学生名(stu_name)分组,学生名相同的,学生年龄(stu_age)用逗号拼接,使用 listagg()函数法拼接

 学新通

 3、上图中出现了两个12,12,实现去重

 3.1 listagg() 函数 去重

【方法1】使用正则表达式去重,oracle 11g 和oracle 19c都适用

  1.  
    select
  2.  
    stu_name,
  3.  
    regexp_replace(listagg(stu_age,',') within group (order by stu_age),
  4.  
    '([^,] )(,\1)*(,|$)','\1\3') stu_age
  5.  
    from student group by stu_name

学新通

【方法2】先把数据去重在使用listagg()函数,oracle 11g 和oracle 19c都适用 

  1.  
    select
  2.  
    stu_name,
  3.  
    listagg(stu_age,',') within group (order by stu_age) stu_age
  4.  
    from (select DISTINCT stu_name,stu_age from student)
  5.  
    group by stu_name

学新通

 【方法3】直接使用listagg( )函数 distinct方法,适用oracle 19c 不适用oracle 11g

  1.  
    select
  2.  
    stu_name,
  3.  
    listagg(DISTINCT stu_age,',') within group (order by stu_age) stu_age
  4.  
    from student
  5.  
    group by stu_name

 学新通

 【方法3简化】:oracle 19c 可以不写 within group(order by xxx),如果需要对去重结果排序可以加上

  1.  
    select
  2.  
    stu_name,
  3.  
    listagg(DISTINCT stu_age,',') stu_age
  4.  
    from student
  5.  
    group by stu_name

 3.2 wm_concat()函数 去重 

 【方法1】直接使用wm_concat( )函数 distinct方法,适用oracle 11g 不适用oracle 19c

  1.  
    select
  2.  
    stu_name,
  3.  
    wm_concat(DISTINCT stu_age) stu_age
  4.  
    from student
  5.  
    group by stu_name

使用Oracle 19c 测试 wm_concat()函数会报错

学新通

 总结:尽量使用listagg函数,避免使用wm_concat,11gr2之后的版本中WM_CONCAT函数已经弃用,使用listagg函数代替wm_concat

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfgifei
系列文章
更多 icon
同类精品
更多 icon
继续加载