再谈字符串合并问题(类似SUM(字符串字段))

bluepower2008 2003-01-02 02:17:49
飘香曾经对此问题给出一种解答方法:
http://expert.csdn.net/Expert/topic/632/632928.xml?temp=.8559076
后来,xuzhenhua21 (舍得) 又对该问题开了个讨论贴:
http://expert.csdn.net/Expert/topic/1309/1309227.xml?temp=.1356012

这个问题其实也曾让我苦思冥想过很长时间,最好的办法当然是希望mssql xp加入这种语法;但另一方面,本着没有路我们也要创造路的原则,所以这里提供另一种实现的思路:
--设表名为b,分组的字段名为gid(int),字符串字段为str(varchar(100)),同时b表的主关键字字段为id(int)
set nocount on
declare @imax int,@i int,@sql varchar(8000)
set @imax = 0
set @i = 0
select top 1 @imax = count(*) from b group by gid order by count(*) desc

select gid into #t from b group by gid order by gid

while @i < @imax
begin
set @sql = 'alter table #t add value' + convert(varchar,@i+1) + ' varchar(100) null'
exec(@sql)
set @sql = 'update m set m.value' + convert(varchar,@i+1) + '=n.value from #t as m,
(select b2.value,min(b2.gid) as gid from b as b1,b as b2
where b1.gid in (select gid from b group by gid having count(*) >' + convert(varchar,@i) + ')
and b1.gid = b2.gid and b1.id <= b2.id
group by b2.value
having count(*) = ' + convert(varchar,@i+1) +
') as n where m.gid = n.gid'
exec(@sql)
set @i = @i + 1
end
select * from #t
drop table #t
set nocount off

--表构造语句
create table b(id int,gid int,value varchar(100))

insert b values(1,3,'river')
insert b values(2,1,'mother')
insert b values(3,1,'C++')
insert b values(4,2,'love')
insert b values(5,1,'hate')
insert b values(6,3,'gaoding')

开这个帖子是为了抛砖引玉,希望还有其他更好的办法提供!谢谢!
...全文
375 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
OpenVMS 2003-06-28
  • 打赏
  • 举报
回复
UP
zjcxc 元老 2003-06-28
  • 打赏
  • 举报
回复
用函数最好,但是缺乏能用性.
用存储过程能解决通用性问题,但没办法在查询语句中使用.

两难.
bjay 2003-06-28
  • 打赏
  • 举报
回复
上,向上。
mymmsc 2003-06-27
  • 打赏
  • 举报
回复
我顶!
bjay 2003-05-29
  • 打赏
  • 举报
回复
这么好的贴子怎么这么长时间没人回?我顶上去。

如果能用函数解决,我还是支持用函数。但多知道一种方法也有好处。
joist 2003-05-06
  • 打赏
  • 举报
回复
to 海兄

create function getstr(@gId int)
returns Nvarchar(2000)
as
begin
declare @str Nvarchar(2000)
set @str=N''
select @str=@str+N','+value from b
where gid=@gid
set @str=right(@str,len(@str)-1)
return @str
end
GO


调用:
select distinct gid,dbo.getstr(gid) as value
from b
or
select gid,dbo.getstr(gid) as value
from b
group by gid



能否说明你所写的函数,具体参数,谢谢!








joist 2003-05-06
  • 打赏
  • 举报
回复
to 海兄
回复人: Haiwer(海阔天空) ( ) 信誉:140 2003-1-2 22:23:03 得分:0

create function getstr(@gId int)
returns Nvarchar(2000)
as
begin
declare @str Nvarchar(2000)
set @str=N''
select @str=@str+N','+value from b
where gid=@gid
set @str=right(@str,len(@str)-1)
return @str
end
GO


调用:
select distinct gid,dbo.getstr(gid) as value
from b
or
select gid,dbo.getstr(gid) as value
from b
group by gid

能否说明你所写的函数,具体参数,谢谢!


这个方法需要说明的是:
1、7.0及一下搬本部支持子定义函数。
2、效率问题,没有研究,到底效率怎么样。






lang_ren 2003-03-20
  • 打赏
  • 举报
回复
yoki 2003-03-20
  • 打赏
  • 举报
回复
good good study
day day up~
白驼山宋兵甲 2003-03-20
  • 打赏
  • 举报
回复
用游标怎么解决呢?

7.0 不支持函数吧
jiezhi 2003-03-09
  • 打赏
  • 举报
回复
我个人sum(字符串)这样的东西没有什么实际意义。
bjay 2003-03-04
  • 打赏
  • 举报
回复
我也是看了精华?还是FAQ中的帖子知道的上面提到的方法,一直想用海兄的方法,但我的SQL SERVER7.0不支持function我也没办法。:(
mymmsc 2003-03-04
  • 打赏
  • 举报
回复
我来学习一下。
chenchangfu 2003-03-04
  • 打赏
  • 举报
回复
xue xi
andyzq 2003-02-28
  • 打赏
  • 举报
回复
学习
caiyunxia 2003-02-23
  • 打赏
  • 举报
回复
up
waitwater 2003-02-16
  • 打赏
  • 举报
回复
学习中......
TedZhou 2003-01-24
  • 打赏
  • 举报
回复
如果是想串接字符串,海量数据就没有意义了,最多8000条数据,而实际应用中碰到的最多的也就是几条几十条几百条数据而已,用游标和用循环没啥区别,愿意怎么用都可以:)
流星尔 2003-01-24
  • 打赏
  • 举报
回复
我学习了老半天自定义函数,结果写出来一段代码,正高兴的准备贴上来,结果发现海兄都贴在这几百年了。为什么总慢人家一步啊
bluepower2008 2003-01-11
  • 打赏
  • 举报
回复
对于这个问题,自定义函数有两种,一种是定义成标量函数,直接在字段中使用,一种是定义成表值函数,当作一个表来使用。即以下形式:
1。select gid,fsum(...) from b group by gid --标量函数
2。select gid,sumstr from fsumtable(...) --表值函数

飘香的改进版倒是可以做成表值函数,通过第2种方式来调用。但是这种方式的效率如何,有没有更好的办法,需要做一些测试。我现在没时间,等哪天有空,我测试一下,再公布测试结果。如果哪位有时间有兴趣也可以试试。

对于第一种方式,除了海兄的办法外,还有没有更通用更有效的方法?
加载更多回复(15)

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧