Oracle列转行函数vm_concat在19C版本不兼容解决方案本文记录一下Oracle列转行函数在Oracle11的一些不兼容问题,vm_concat在一些业务场景是必须的 。不过这个函数使用要谨慎 , 底层实现应该也是group by等等实现的 , 性能并不是特别好 。这个函数在Oracle12C是没有的,在Oracle11是不太兼容的 , Oracle10可以正常使用 。最近开发场景遇到这个问题 , 可以写到了自定义列转行函数的办法去解决 。但是这种办法并不一定适用所有的业务场景 。
解决方案
通过自定义函数解决也是可以的,不过我并不是这样做的 。下面介绍一下我的解决方法 。首先分析一下 , Oracle19C不兼容vm_concat列转行函数,并不代表其它函数不兼容,或许可以找到其它代替的,通过找资料,发现了Oracle11提供的另外一个函数:listagg()函数 语法:listagg(参数,‘分隔符’) within group(order by 参数id),验证可以实现在19C正常使用
例如:
to_char(wm_concat(t.busi_id))
可以改写成:
to_char(listagg(t.busi_id,',' ) within GROUP (order by (t.busi_id)))
SQL如:
SELECT listagg(t.busi_id, ',') within GROUP(order by (t.busi_id))
FROM sys_cdc_sync_record t
WHERE cdc_sql_type = 'INSERT_SELECT'
oracle聚合函数XMLAGG用法简介 XMLAGG函数语法基本如图,可以用于列转行,列转行函数在oracle里有好几种方法,wm_concat也可以做
这里介绍wm_concat是因为 XMLAGG实现效果和wm_concat是一样的,只是性能方面不一样,注意:XMLAGG最好排序一下,性能会好点
XMLAGG例子:
需要实现一个table,有一列的效果是:用户姓名A(账号a),用户姓名B(账号b)...这种格式 。这就想到oracle的列转行函数 。可以用类似这种格式(a || '(' || b || ')'),a表示用户名字段,b表示账号字段 。
查询出来 , 是用,分隔的数据 , 实现列转行显示
XMLAGG常用语法:
wm_concat会有版本不兼容问题,
oracle列转行函数还有listagg,也可以用sys_connect_by_path来做,具体根据需求来
oracle的sql语句列转行oracle中列传行可用wm_concat来实现 。
如test表中数据如下oracle怎么样列转行:
现要将name列一列显示成行oracle怎么样列转行,可用如下语句:
select wm_concat(name) from test;
结果:
Oracle中列转行,如何实现?基本思路:对每班学生排序oracle怎么样列转行,根据序号构造列名,拼接动态sql
--测试数据
create table
("学生" varchar2(10)
,"学号" varchar2(10)
,"班级" varchar2(10)
);
insert into "表A"
select '张三','100','一班' from dual union all
select '李四','101','二班' from dual union all
select '王五','102','一班' from dual union all
select '赵六','103','三班' from dual union all
select '李二','104','二班' from dual
--动态拼接Pivot
declare
sqlstr varchar2(8000):='';
begin
--构造类似于 '学号1','学号2',...oracle怎么样列转行的字符串
for x in (
select distinct row_number() over (partition by "班级" order by "学号") seq
from "表A" order by seq ) loop
【oracle怎么样列转行 oracle怎么将列转行】sqlstr := sqlstr || ',''' || '学号' ||to_char(x.seq)||'''';
end loop;
sqlstr:=substr(sqlstr,2,length(sqlstr)-1);
--将前面构造的字符串放入Pivot语句中
sqlstr:='
select * from (
select "学号","班级", ''学号''|| to_char(
row_number() over (partition by "班级" order by "学号")) seq
from "表A") t
pivot(
max("学号")
for seq in ('||sqlstr||')
)';
--dbms_output.put_line(sqlstr);
--将查询结果放入临时视图中
sqlstr := 'CREATE OR REPLACE VIEW tmp_resultAS '|| sqlstr;
--dbms_output.put_line(sqlstr);
execute immediate sqlstr;
end;
--查看结果
select * from tmp_result;
结果如下:
oracle列转行、列转行SELECT REGEXP_SUBSTR('aa,bbb,cccc', '[^,] ', 1, rownum)
from dual
connect by level = LENGTH(regexp_replace('aa,bbb,cccc', '[^,] ', ''));
with baseData as(
select '1' id,'aaa' name from dual
union all
select '2' ,'bbb' from dual
)
SELECT listagg(name ,',') WITHIN GROUP (ORDER BY id)
FROMbaseData ;
oracle列转行SQL create table t (a number, b varchar2(10));
表已创建 。
SQL insert into t values(1,'A');
已创建 1 行 。
SQL insert into t values(1,'B');
已创建 1 行 。
SQL insert into t values(2,'A');
已创建 1 行 。
SQL insert into t values(2,'B');
已创建 1 行 。
SQL insert into t values(3,'C');
已创建 1 行 。
SQL insert into t values(3,'F');
已创建 1 行 。
SQL insert into t values(4,'D');
已创建 1 行 。
SQL commit;
提交完成 。
SQL select a,max(decode(c,1,b,null)),
2max(decode(c,2,b,null)),
3max(decode(c,3,b,null))
4from(selecta,b,row_number()over(partition by a order by b ) c from t)
5* group by a
SQL /
A MAX(DECODE MAX(DECODE MAX(DECODE
---------- ---------- ---------- ----------
1 AB
2 AB
3 CF
4 D
SQL
oracle怎么样列转行的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于oracle怎么将列转行、oracle怎么样列转行的信息别忘了在本站进行查找喔 。
推荐阅读
- 小米鸿蒙电视系统,小米电视升级鸿蒙
- sqlserver怎么删除表中的某一列,sql怎样删除表中一列
- vb.net实参形参的简单介绍
- linux中注销命令,linux命令注销用户
- excel带框符号怎么弄,excl框框带勾在哪里
- nct直播斗鱼,nct全员直播
- linux命令追加日志 shell追加日志
- 骆驼什么时候交配视频,骆驼什么时候产崽
- 小学小朋友角色扮演游戏,小朋友角色扮演的活动叫什么名字