oracle-mysql数据迁移之sql处理----合并行

来源:互联网 发布:淘宝小二分工 编辑:程序博客网 时间:2024/04/29 14:35

关于oracle向mysql迁移,其中关于sql的不同 让我很有感触,不同的数据库原来细节这么多啊....我要专题总结下。

sql中的不同直接和存储过程、视图息息相关,这里总结几个比较常用的业务sql,进行对比总结。

这篇专门说下合并行:

合并行(多行变成一行)                                       感谢: http://blog.csdn.net/lifuxiangcaohui/article/details/6132147  

一、mysql的合并行比较简单:就是使用group_concat函数


完整的语法如下:

group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])
举例:

业务表

语句:

select id,group_concat(name) from aaa group by id;(默认是逗号分隔)

效果:

其他字段的用法 我只写出语句 ,效果图就不发了

select  id,group_concat(DISTINCT name) from aaa group by id; ##DISTINCT 可以去掉重复的name值,很不错select  id,group_concat( name order by name asc) from aaa group by id; ##我们可以控制同一行中name里每个值的顺序select  id,group_concat( name SEPARATOR '##') from aaa group by id;  ##指定分隔符
注:我特意试了下int和date类型 也没有问题。


二、 oracle的合并行有点麻烦,同时一查才发现网上好多方法...汗颜啊。可以看看别人怎么弄的 http://lovejuan1314.iteye.com/blog/413694

我的方法及比较针对业务了,就是把某个varchar2的字段由多行数据 变成特殊字符串分隔的一行,不涉及数字型和日期型:

我的函数是:

create or replace function str_list2( key_name in varchar2,key in varchar2,coname in varchar2,tname in varchar2 )return varchar2astype rc is ref cursor;str varchar2(4000);sep varchar2(2);val varchar2(4000);cur rc;beginopen cur for 'select '||coname||' from '|| tname || ' where ' || key_name || ' = :x ' using key;loopfetch cur into val;exit when cur%notfound;str := str || sep || val;sep := ',';  ---这里可以定制分隔符,也可以通过输入参数来传end loop;close cur;return str;end; 
函数参数说明:

str_list2( key_name in varchar2,key in varchar2,coname in varchar2,tname in varchar2 )            分组字段名(字符串)     分组字段名      合并列名           表名(字符串)


函数测试:还是刚刚那个表,只不过用oracle建的,是varchar2类型,就不发图了:

实例sql如下:

select id,str_list2('id',id,'name','aa') as name from aa group by id



0 0