数据库
首页 > 数据库> > SQL SERVER使用STUFF函数拼接记录为逗号分隔符

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?      

  1. /*  
  2. 标题:按某字段合并字符串之一(简单合并)  
  3. 作者:(十八年风雨,守得冰山雪莲花开)  
  4. 时间:2008-11-06  
  5. 地点:广东深圳  
  6.   
  7. 描述:将如下形式的数据按id字段合并value字段。  
  8. id    value  
  9. ----- ------   
  10. 1     aa  
  11. 1     bb  
  12. 2     aaa  
  13. 2     bbb  
  14. 2     ccc  
  15. 需要得到结果:  
  16. id     value  
  17. ------ -----------   
  18. 1      aa,bb  
  19. 2      aaa,bbb,ccc  
  20. 即:group by id, 求 value 的和(字符串相加)  
  21. */  
  22. --1、sql2000中只能用自定义的函数解决   
  23. create table tb(id int, value varchar(10))  
  24. insert into tb values(1, 'aa')  
  25. insert into tb values(1, 'bb')  
  26. insert into tb values(2, 'aaa')  
  27. insert into tb values(2, 'bbb')  
  28. insert into tb values(2, 'ccc')  
  29. go  
  30.   
  31. create function dbo.f_str(@id varchar(10)) returns varchar(1000)  
  32. as  
  33. begin  
  34.   declare @str varchar(1000)  
  35.   select @str = isnull(@str + ',' , '') + cast(value as varchar) from tb where id = @id  
  36.   return @str  
  37. end  
  38. go  
  39.   
  40. --调用函数   
  41. select id , value = dbo.f_str(id) from tb group by id  
  42.   
  43. drop function dbo.f_str  
  44. drop table tb  
  45.   
  46.   
  47. --2、sql2005中的方法   
  48. create table tb(id int, value varchar(10))  
  49. insert into tb values(1, 'aa')  
  50. insert into tb values(1, 'bb')  
  51. insert into tb values(2, 'aaa')  
  52. insert into tb values(2, 'bbb')  
  53. insert into tb values(2, 'ccc')  
  54. go  
  55.   
  56. select id, [value] = stuff((select ',' + [value] from tb t where id = tb.id for xml path('')) , 1 , 1 , '')  
  57. from tb  
  58. group by id  
  59.   
  60. drop table tb  
  61.   
  62.   
  63. --3、使用游标合并数据   
  64. create table tb(id int, value varchar(10))  
  65. insert into tb values(1, 'aa')  
  66. insert into tb values(1, 'bb')  
  67. insert into tb values(2, 'aaa')  
  68. insert into tb values(2, 'bbb')  
  69. insert into tb values(2, 'ccc')  
  70. go  
  71. declare @t table(id int,value varchar(100))--定义结果集表变量   
  72. --定义游标并进行合并处理   
  73. declare my_cursor cursor local for  
  74. select id , value from tb  
  75. declare @id_old int , @id int , @value varchar(10) , @s varchar(100)  
  76. open my_cursor  
  77. fetch my_cursor into @id , @value  
  78. select @id_old = @id , @s=''  
  79. while @@FETCH_STATUS = 0  
  80. begin  
  81.     if @id = @id_old  
  82.        select @s = @s + ',' + cast(@value as varchar)  
  83.     else  
  84.       begin  
  85.         insert @t values(@id_old , stuff(@s,1,1,''))  
  86.         select @s = ',' + cast(@value as varchar) , @id_old = @id  
  87.       end  
  88.     fetch my_cursor into @id , @value  
  89. END  
  90. insert @t values(@id_old , stuff(@s,1,1,''))  
  91. close my_cursor  
  92. deallocate my_cursor  
  93.   
  94. select * from @t  
  95. 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二维码小麦苗的微店

   小麦苗的weixin公众号      小麦苗的DBA宝典QQ群2       小麦苗的weixin二维码          小麦苗的微店

.............................................................................................................................................


ico_mailme_02.png
欢迎与我联系






来自 “ 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?      

  1. /*  
  2. 标题:按某字段合并字符串之一(简单合并)  
  3. 作者:(十八年风雨,守得冰山雪莲花开)  
  4. 时间:2008-11-06  
  5. 地点:广东深圳  
  6.   
  7. 描述:将如下形式的数据按id字段合并value字段。  
  8. id    value  
  9. ----- ------   
  10. 1     aa  
  11. 1     bb  
  12. 2     aaa  
  13. 2     bbb  
  14. 2     ccc  
  15. 需要得到结果:  
  16. id     value  
  17. ------ -----------   
  18. 1      aa,bb  
  19. 2      aaa,bbb,ccc  
  20. 即:group by id, 求 value 的和(字符串相加)  
  21. */  
  22. --1、sql2000中只能用自定义的函数解决   
  23. create table tb(id int, value varchar(10))  
  24. insert into tb values(1, 'aa')  
  25. insert into tb values(1, 'bb')  
  26. insert into tb values(2, 'aaa')  
  27. insert into tb values(2, 'bbb')  
  28. insert into tb values(2, 'ccc')  
  29. go  
  30.   
  31. create function dbo.f_str(@id varchar(10)) returns varchar(1000)  
  32. as  
  33. begin  
  34.   declare @str varchar(1000)  
  35.   select @str = isnull(@str + ',' , '') + cast(value as varchar) from tb where id = @id  
  36.   return @str  
  37. end  
  38. go  
  39.   
  40. --调用函数   
  41. select id , value = dbo.f_str(id) from tb group by id  
  42.   
  43. drop function dbo.f_str  
  44. drop table tb  
  45.   
  46.   
  47. --2、sql2005中的方法   
  48. create table tb(id int, value varchar(10))  
  49. insert into tb values(1, 'aa')  
  50. insert into tb values(1, 'bb')  
  51. insert into tb values(2, 'aaa')  
  52. insert into tb values(2, 'bbb')  
  53. insert into tb values(2, 'ccc')  
  54. go  
  55.   
  56. select id, [value] = stuff((select ',' + [value] from tb t where id = tb.id for xml path('')) , 1 , 1 , '')  
  57. from tb  
  58. group by id  
  59.   
  60. drop table tb  
  61.   
  62.   
  63. --3、使用游标合并数据   
  64. create table tb(id int, value varchar(10))  
  65. insert into tb values(1, 'aa')  
  66. insert into tb values(1, 'bb')  
  67. insert into tb values(2, 'aaa')  
  68. insert into tb values(2, 'bbb')  
  69. insert into tb values(2, 'ccc')  
  70. go  
  71. declare @t table(id int,value varchar(100))--定义结果集表变量   
  72. --定义游标并进行合并处理   
  73. declare my_cursor cursor local for  
  74. select id , value from tb  
  75. declare @id_old int , @id int , @value varchar(10) , @s varchar(100)  
  76. open my_cursor  
  77. fetch my_cursor into @id , @value  
  78. select @id_old = @id , @s=''  
  79. while @@FETCH_STATUS = 0  
  80. begin  
  81.     if @id = @id_old  
  82.        select @s = @s + ',' + cast(@value as varchar)  
  83.     else  
  84.       begin  
  85.         insert @t values(@id_old , stuff(@s,1,1,''))  
  86.         select @s = ',' + cast(@value as varchar) , @id_old = @id  
  87.       end  
  88.     fetch my_cursor into @id , @value  
  89. END  
  90. insert @t values(@id_old , stuff(@s,1,1,''))  
  91. close my_cursor  
  92. deallocate my_cursor  
  93.   
  94. select * from @t  
  95. drop table tb  


标签:insert,into,value,SERVER,STUFF,values,SQL,tb,id
来源: https://blog.51cto.com/lhrbest/2703354