SQL函数将某个字段合并在一起的操作

吾爱主题 阅读:165 2024-04-02 07:59:20 评论:0

最近遇到需要将关联表中的某个字段全部查询出来并且重新组合为一个字段,这个时候普通的连接查询就满足不了需求了,需要用到SQL函数来完成:

?
1 2 3 4 5 6 7 8 9 ALTER function dbo.getResCodesByOwnerId(@OwnerId INT ) returns nvarchar(2000) as begin DECLARE @codes VARCHAR (2000) SET @codes= '' select @codes=stuff(( select ',' +residence_code from crm_owner co left join crm_owner_residence cor on co.id=cor.owner_id where co.id=@OwnerId for xml path( '' )),1,1, '' ) return @codes END

拿id = 2 的数据来做测试,得到结果:

?
1 2 select (数据库名).getResCodesByOwnerId(fr.owner_id) as room_code from t1 fr left join t2 frd on fr.owner_id=frd.owner_id

结果:

?
1 1101010105,11GU002,1101010104

补充:SQL STUFF函数 拼接字符串

今日看到一篇文章,是关于和并列的,也研究了下,还是不错的

要这种效果。

?
1 2 3 4 5 6 7 8 9 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替换删掉的字符。*/

?
1 2 3 4 5 6 7 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

这样即可。

收集的资料

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 /* 标题:按某字段合并字符串之一(简单合并) 作者:(十八年风雨,守得冰山雪莲花开) 地点:广东深圳   描述:将如下形式的数据按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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。

原文链接:https://blog.csdn.net/Megamind_HL/article/details/79977566

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容