当前位置:数据库 > > 正文

sql怎么查询字段合并(SQL函数将某个字段合并在一起的操作)

时间:2022-01-17 01:41:36类别:数据库

sql怎么查询字段合并

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

最近遇到需要将关联表中的某个字段全部查询出来并且重新组合为一个字段,这个时候普通的连接查询就满足不了需求了,需要用到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函数 拼接字符串

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

    sql怎么查询字段合并(SQL函数将某个字段合并在一起的操作)

    要这种效果。

  • ?
  • 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

    标签:
    上一篇下一篇

    猜您喜欢

    热门推荐