SQL SERVER使用STUFF函数拼接记录为逗号分隔符
作者:互联网
SQL SERVER使用STUFF函数拼接记录为逗号分隔符
SQL STUFF函数 拼接字符串
今日看到一篇文章,是关于和并列的,也研究了下,还是不错的
要这种效果。
create table tb(idint, value varchar(10))
insert into tbvalues(1,'aa')
insert into tbvalues(1,'bb')
insert into tbvalues(2,'aaa')
insert into tbvalues(2,'bbb')
insert into tbvalues(2,'ccc')
go
/* stuff(param1, startIndex, length, param2)
说明:将param1中自startIndex(SQL中都是从1开始,而非0)起,删除length个字符,然后用param2替换删掉的字符。*/
SELECT id,
value = stuff
((SELECT ',' + value
FROM tb AS t
WHERE t .id = tb.id FOR xml path('')), 1, 1, '')
FROM tb
GROUP BY id
这样即可。
例如 两个表 汽车分组表tb_group,和汽车表tb_car
select id, groupname, contace, mobile, begintime, endtime, parkingcount, groupType
,value = stuff((SELECT ',' + plate FROM tb_car AS t WHERE t .groupid = [tb_group].id FOR xml path('')), 1, 1, '')
from [dbo].[tb_group]
结果为
===================================================================================
收集的资料
[sql] view plaincopyprint?
- /*
- 标题:按某字段合并字符串之一(简单合并)
- 作者:(十八年风雨,守得冰山雪莲花开)
- 时间:2008-11-06
- 地点:广东深圳
- 描述:将如下形式的数据按id字段合并value字段。
- id value
- ----- ------
- 1 aa
- 1 bb
- 2 aaa
- 2 bbb
- 2 ccc
- 需要得到结果:
- id value
- ------ -----------
- 1 aa,bb
- 2 aaa,bbb,ccc
- 即:group by id, 求 value 的和(字符串相加)
- */
- --1、sql2000中只能用自定义的函数解决
- create table tb(id int, value varchar(10))
- insert into tb values(1, 'aa')
- insert into tb values(1, 'bb')
- insert into tb values(2, 'aaa')
- insert into tb values(2, 'bbb')
- insert into tb values(2, 'ccc')
- go
- create function dbo.f_str(@id varchar(10)) returns varchar(1000)
- as
- begin
- declare @str varchar(1000)
- select @str = isnull(@str + ',' , '') + cast(value as varchar) from tb where id = @id
- return @str
- end
- go
- --调用函数
- select id , value = dbo.f_str(id) from tb group by id
- drop function dbo.f_str
- drop table tb
- --2、sql2005中的方法
- create table tb(id int, value varchar(10))
- insert into tb values(1, 'aa')
- insert into tb values(1, 'bb')
- insert into tb values(2, 'aaa')
- insert into tb values(2, 'bbb')
- insert into tb values(2, 'ccc')
- go
- select id, [value] = stuff((select ',' + [value] from tb t where id = tb.id for xml path('')) , 1 , 1 , '')
- from tb
- group by id
- drop table tb
- --3、使用游标合并数据
- create table tb(id int, value varchar(10))
- insert into tb values(1, 'aa')
- insert into tb values(1, 'bb')
- insert into tb values(2, 'aaa')
- insert into tb values(2, 'bbb')
- insert into tb values(2, 'ccc')
- go
- declare @t table(id int,value varchar(100))--定义结果集表变量
- --定义游标并进行合并处理
- declare my_cursor cursor local for
- select id , value from tb
- declare @id_old int , @id int , @value varchar(10) , @s varchar(100)
- open my_cursor
- fetch my_cursor into @id , @value
- select @id_old = @id , @s=''
- while @@FETCH_STATUS = 0
- begin
- if @id = @id_old
- select @s = @s + ',' + cast(@value as varchar)
- else
- begin
- insert @t values(@id_old , stuff(@s,1,1,''))
- select @s = ',' + cast(@value as varchar) , @id_old = @id
- end
- fetch my_cursor into @id , @value
- END
- insert @t values(@id_old , stuff(@s,1,1,''))
- close my_cursor
- deallocate my_cursor
- select * from @t
- drop table tb
小麦苗课程
小麦苗课堂开课啦,如下是现有的课程,欢迎咨询小麦苗:
课程名称 | 课时 | 上课时间 | 价格 |
OCP(从入门到专家) | 每年1期,35课时左右/期 | 20:00-22:00 | 1588(可优惠) |
OCM认证 | 每年N期,9课时/期 | 20:00-22:00 | 22888 |
高可用课程(rac+dg+ogg) | 每年1期,20课时左右/期 | 20:00-22:00 | 1888(可优惠) |
Oracle初级入门 | 每年1期,15课时左右/期 | 20:00-22:00 | 800 |
Oracle健康检查脚本 | 可weixin或微店购买。 | 88 | |
Oracle数据库技能直通车 | 包含如下3个课程: ①《11g OCP网络课程培训》(面向零基础) 价值1600元 ②《11g OCM网络班课程培训》(Oracle技能合集)价值10000+元 ③《RAC + DG + OGG 高可用网络班课程》 价值2000元 以上3个课程全部打包只要5888,只要5888所有课程带回家,终身指导!所有课程都是在线讲课,不是播放视频,课件全部赠送! 注意:以上OCP和OCM课程只包括培训课程,不包括考试费用。OCM提供培训+视频,但是不提供练习环境和资料。报名一次,OCP和高可用的课程可以免费终身循环听课。 | 5888 | |
OCP+高可用(rac+dg+ogg) | 报名OCP+高可用课程,可以优惠300元,优惠后的价格为3188. | 3188(可优惠) |
注意:
1、每次上课前30分钟答疑。
2、OCM实时答疑,提供和考试一样的练习模拟环境,只要按照老师讲的方式来练习,可以保证100%通过。
3、授课方式:YY语音网络直播讲课(非视频) + QQ互动答疑 + 视频复习。
4、OCP课时可以根据大家学习情况进行增加或缩减。
5、以上所有课程均可循环听课。
6、12c OCM课程私聊。
7、Oracle初级入门课程,只教大家最实用+最常用的Oracle操作维护知识。
8、以上所有课程,可以加小麦苗weixin(lhrbestxh)或QQ(646634621)详聊,优惠多多。
培训项目 | 连接地址 |
DB笔试面试历史连接 | http://mp.weixin.qq.com/s/Vm5PqNcDcITkOr9cQg6T7w |
OCP培训说明连接 | https://mp.weixin.qq.com/s/2cymJ4xiBPtTaHu16HkiuA |
OCM培训说明连接 | https://mp.weixin.qq.com/s/7-R6Cz8RcJKduVv6YlAxJA |
高可用(RAC+DG+OGG)培训说明连接 | https://mp.weixin.qq.com/s/4vf042CnOdAD8zDyjUueiw |
OCP最新题库解析历史连接(052) | http://mp.weixin.qq.com/s/bUgn4-uciSndji_pUbLZfA |
微店地址 | https://weidian.com/s/793741433?wfr=c&ifr=shopdetail |
About Me
.............................................................................................................................................
● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除
● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、博客园(http://www.cnblogs.com/lhrbest)和个人weixin公众号(xiaomaimiaolhr)上有同步更新
● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/
● 本文博客园地址:http://www.cnblogs.com/lhrbest
● 本文pdf版、个人简介及小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/
● 数据库笔试面试题库及解答:http://blog.itpub.net/26736162/viewspace-2134706/
● DBA宝典今日头条号地址:http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826
.............................................................................................................................................
● QQ群号:230161599(满)、618766405
● weixin群:可加我weixin,我拉大家进群,非诚勿扰
● 联系我请加QQ好友(646634621),注明添加缘由
● 于 2018-07-01 06:00 ~ 2018-07-31 24:00 在魔都完成
● 最新修改时间:2018-07-01 06:00 ~ 2018-07-31 24:00
● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解
● 版权所有,欢迎分享本文,转载请保留出处
.............................................................................................................................................
● 小麦苗的微店:https://weidian.com/s/793741433?wfr=c&ifr=shopdetail
● 小麦苗出版的数据库类丛书:http://blog.itpub.net/26736162/viewspace-2142121/
● 小麦苗OCP、OCM、高可用网络班:http://blog.itpub.net/26736162/viewspace-2148098/
.............................................................................................................................................
使用weixin客户端扫描下面的二维码来关注小麦苗的weixin公众号(xiaomaimiaolhr)及QQ群(DBA宝典)、添加小麦苗weixin,学习最实用的数据库技术。
小麦苗的weixin公众号 小麦苗的DBA宝典QQ群2 小麦苗的weixin二维码 小麦苗的微店
.............................................................................................................................................
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26736162/viewspace-2157302/,如需转载,请注明出处,否则将追究法律责任。
今日看到一篇文章,是关于和并列的,也研究了下,还是不错的
要这种效果。
create table tb(idint, value varchar(10))
insert into tbvalues(1,'aa')
insert into tbvalues(1,'bb')
insert into tbvalues(2,'aaa')
insert into tbvalues(2,'bbb')
insert into tbvalues(2,'ccc')
go
/* stuff(param1, startIndex, length, param2)
说明:将param1中自startIndex(SQL中都是从1开始,而非0)起,删除length个字符,然后用param2替换删掉的字符。*/
SELECT id,
value = stuff
((SELECT ',' + value
FROM tb AS t
WHERE t .id = tb.id FOR xml path('')), 1, 1, '')
FROM tb
GROUP BY id
这样即可。
例如 两个表 汽车分组表tb_group,和汽车表tb_car
select id, groupname, contace, mobile, begintime, endtime, parkingcount, groupType
,value = stuff((SELECT ',' + plate FROM tb_car AS t WHERE t .groupid = [tb_group].id FOR xml path('')), 1, 1, '')
from [dbo].[tb_group]
结果为
===================================================================================
收集的资料
[sql] view plaincopyprint?
- /*
- 标题:按某字段合并字符串之一(简单合并)
- 作者:(十八年风雨,守得冰山雪莲花开)
- 时间:2008-11-06
- 地点:广东深圳
- 描述:将如下形式的数据按id字段合并value字段。
- id value
- ----- ------
- 1 aa
- 1 bb
- 2 aaa
- 2 bbb
- 2 ccc
- 需要得到结果:
- id value
- ------ -----------
- 1 aa,bb
- 2 aaa,bbb,ccc
- 即:group by id, 求 value 的和(字符串相加)
- */
- --1、sql2000中只能用自定义的函数解决
- create table tb(id int, value varchar(10))
- insert into tb values(1, 'aa')
- insert into tb values(1, 'bb')
- insert into tb values(2, 'aaa')
- insert into tb values(2, 'bbb')
- insert into tb values(2, 'ccc')
- go
- create function dbo.f_str(@id varchar(10)) returns varchar(1000)
- as
- begin
- declare @str varchar(1000)
- select @str = isnull(@str + ',' , '') + cast(value as varchar) from tb where id = @id
- return @str
- end
- go
- --调用函数
- select id , value = dbo.f_str(id) from tb group by id
- drop function dbo.f_str
- drop table tb
- --2、sql2005中的方法
- create table tb(id int, value varchar(10))
- insert into tb values(1, 'aa')
- insert into tb values(1, 'bb')
- insert into tb values(2, 'aaa')
- insert into tb values(2, 'bbb')
- insert into tb values(2, 'ccc')
- go
- select id, [value] = stuff((select ',' + [value] from tb t where id = tb.id for xml path('')) , 1 , 1 , '')
- from tb
- group by id
- drop table tb
- --3、使用游标合并数据
- create table tb(id int, value varchar(10))
- insert into tb values(1, 'aa')
- insert into tb values(1, 'bb')
- insert into tb values(2, 'aaa')
- insert into tb values(2, 'bbb')
- insert into tb values(2, 'ccc')
- go
- declare @t table(id int,value varchar(100))--定义结果集表变量
- --定义游标并进行合并处理
- declare my_cursor cursor local for
- select id , value from tb
- declare @id_old int , @id int , @value varchar(10) , @s varchar(100)
- open my_cursor
- fetch my_cursor into @id , @value
- select @id_old = @id , @s=''
- while @@FETCH_STATUS = 0
- begin
- if @id = @id_old
- select @s = @s + ',' + cast(@value as varchar)
- else
- begin
- insert @t values(@id_old , stuff(@s,1,1,''))
- select @s = ',' + cast(@value as varchar) , @id_old = @id
- end
- fetch my_cursor into @id , @value
- END
- insert @t values(@id_old , stuff(@s,1,1,''))
- close my_cursor
- deallocate my_cursor
- select * from @t
- drop table tb
标签:insert,into,value,SERVER,STUFF,values,SQL,tb,id 来源: https://blog.51cto.com/lhrbest/2703354