关于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 varchar2 as type rc is ref cursor; str varchar2(4000); sep varchar2(2); val varchar2(4000); cur rc; begin open cur for 'select '||coname||' from '|| tname || ' where ' || key_name || ' = :x ' using key; loop fetch 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