oracle 分隔符 转列,oracle 行列转换函数之WM_CONCAT和LISTAGG的使用(一)

一、wm_concat函数

wm_concat能够实现同样的功能,但是有时在11g中使用需要用to_char()进行转换,否则会出现不兼容现象(WMSYS.WM_CONCAT: 依赖WMSYS 用户,不同oracle环境时可能用不了,返回类型为CLOB,可用substr截取长度后to_char转化为字符类型)。

测试用表test_org_bak

1 select * from test_org_bak;

95ec1ab263fb8c6845e88ccea871c2dc.png

1、:行转列(默认逗号隔开)

1 select wm_concat(level_four_name) name from test_org_bak;

62c364e5eab48c819d1c42bda252902e.png

2、:更换分隔符

1 select replace(wm_concat(level_four_name),',','|') from test_org_bak;

3、:按照事业部分组合并大区

1 select level_three_name,wm_concat(level_four_name) name from test_org_bak group bylevel_three_name;2 select level_three_name,wm_concat(distinct level_four_name) name from test_org_bak group by level_three_name;--可去重

7d9b12e1bdfe654107ecf61b88fcd87a.png

二、listagg函数

注意:listagg函数的第一个参数是需要显示的字段,也就是log_name;第二个参数是数值之间的分隔符;同时还需要进行排序和分组within group (order by name)

一般推荐使用LISTAGG()方法去列转行。或者自定义个方法去实现行转列。

1 select listagg(level_four_name, ',') within group(order by level_four_name) level_four_name1 from test_org_bak;

结果同上1

1 selectlevel_three_name,2 listagg(level_four_name, ',') within group(order bylevel_four_name) level_four_name13 fromtest_org_bak4 group by level_three_name;

a30d5edb75d09f5dc84b912f03dc36d8.png

解决使用聚合函数LISTAGG进行查询后,对查询结果乱码问题进行转码处理listagg(to_char(列名));

还需注意:LISTAGG:11g2才提供的函数,不支持distinct,拼接长度不能大于4000,函数返回为varchar2类型,最大长度为4000;

ps(一个实用方法:我要写一个视图,类似"create or replace view as select 字段1,...字段50 from tablename" ,基表有50多个字段,要是靠手工写太麻烦了,有没有什么简便的方法? 当然有了,看我如果应用wm_concat来让这个需求变简单

1 select 'create or replace view as select'|| wm_concat(column_name) || 'from test'from user_tab_columns where table_name='TEST';

0aee50ccbd1685e1300c98ac9ba7da79.png

)

(注:此为学习记录笔记,仅供参考若有问题请指正,后续补充......)

参考:https://blog.csdn.net/oJerryZuo/article/details/53927057

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值