sybase如何进行字符串拼接

sn_tiantian 2011-06-21 03:56:05
现有这样一张表test(name,content),内容如下
name content
---- -------
aaa 123
aaa 456
bbb 789
---------------

我想查询获得这样的结果
name content
---- -------
aaa 123;456
bbb 789
---------------

即把content内容在group以后拼接起来。这样的一个需求在oralce中很容易实现
select name,wm_concat(content) from test group by name即可以实现

不知道sybase中有没有这样的字符串拼接函数,用来把行连接起来?
...全文
2454 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sn_tiantian 2011-06-22
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wwwwb 的回复:]

space(500) as gd --用来记录每一个分组中content列的累计拼接
0000 as gdnum --用来记录一行记录在分组中的序号

对的,总算明白了,将#TT中的内容显示出来看看就OK了
[/Quote]

好的,多谢你的指点。这段时间才开始接触sybase,以后还请各位大侠多多指教。
wwwwb 2011-06-22
  • 打赏
  • 举报
回复
space(500) as gd --用来记录每一个分组中content列的累计拼接
0000 as gdnum --用来记录一行记录在分组中的序号

对的,总算明白了,将#TT中的内容显示出来看看就OK了
sn_tiantian 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wwwwb 的回复:]

select name,content into #tt from test->
select name,content,space(500) as gd,0000 as gdnum into #tt from test


update #tt set gd=(case when @ee1=name then @ee || ',' || content else content ……
[/Quote]

多谢了。另外再弱弱问一下,我如下的理解是否是正确?

space(500) as gd --用来记录每一个分组中content列的累计拼接
0000 as gdnum --用来记录一行记录在分组中的序号

执行完update语句后,临时表#tt的内容如下:
name content gd gdnum
--------------------------------
aaa 123 123 1
aaa 456 123;456 2
bbb 789 789 1


wwwwb 2011-06-21
  • 打赏
  • 举报
回复
select name,content into #tt from test->
select name,content,space(500) as gd,0000 as gdnum into #tt from test


update #tt set gd=(case when @ee1=name then @ee || ',' || content else content end) ,
@ee=(case when @ee1=name then @ee || ',' || content else content end),
gdnum=(case when @ee1=name then @num+1 else 1 end),
@num=(case when @ee1=name then @num+1 else 1 end),@ee1=name;
select a.* from #tt a inner join
(select name,max(gdnum) as ma from #tt group by name) b
on a.name=b.name and a.gdnum=ma;
sn_tiantian 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wwwwb 的回复:]

仔细看看别人的回复哦

注意gdnum:
select *,space(500) as gd,0000 as gdnum into #tt from blljtest;

gdnum=(case when @ee1=class then @num+1 else 1 end),


select a.* from #tt a inner join
(select class,……
[/Quote]

大侠,我已经试过很长时间了,实在是对sybase不是很熟悉,不然也不会在这里麻烦大家了。我知道这个问题对你可能比较菜,但是对我来说确实有点困难。方便的话,还是劳烦帮我把上面的需求实现一下。谢谢。
wwwwb 2011-06-21
  • 打赏
  • 举报
回复
仔细看看别人的回复哦

注意gdnum:
select *,space(500) as gd,0000 as gdnum into #tt from blljtest;

gdnum=(case when @ee1=class then @num+1 else 1 end),


select a.* from #tt a inner join
(select class,max(gdnum) as ma from #tt group by class) b
on a.class=b.class and a.gdnum=ma;
sn_tiantian 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wwwwb 的回复:]

引用 4 楼 sn_tiantian 的回复:
引用 3 楼 wwwwb 的回复:

示例,自行修改
ALTER PROCEDURE "zz"."blljtest"( /* [IN | OUT | INOUT] 参数名称 参数类型 [DEFAULT 缺省值], ... */ )
/* RESULT( 列名 列类型, ... ) */
BEGIN
declare @ee varcha……
[/Quote]


我试着改了一下,但是结果有问题(bbb行错了),另外,你能稍微解释一下上面的程序么?
name content
---- -------
aaa 123,456
bbb 456
--------------


begin
declare @ee varchar(500)
declare @ee1 varchar(500)
declare @num int
set @ee=''
set @ee1=''
set @num=1
select name,content into #tt from test
update #tt set
@ee=(case when @ee1=name then @ee || ',' || content else content end),
content=(case when @ee1=name then @ee || ',' || content else content end),
@num=(case when @ee1=name then @num+1 else 1 end),
@ee1=name
select a.* from #tt a inner join
(select name,max(content) as ma from #tt group by name) b
on a.name=b.name and a.content=ma

drop table #tt
end
wwwwb 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sn_tiantian 的回复:]
引用 3 楼 wwwwb 的回复:

示例,自行修改
ALTER PROCEDURE "zz"."blljtest"( /* [IN | OUT | INOUT] 参数名称 参数类型 [DEFAULT 缺省值], ... */ )
/* RESULT( 列名 列类型, ... ) */
BEGIN
declare @ee varchar(500);
declare @ee1 varc……
[/Quote]
自行修改,blljtest:表名 class :字段名,自己动手做一下吧,有问题再问
sn_tiantian 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wwwwb 的回复:]

示例,自行修改
ALTER PROCEDURE "zz"."blljtest"( /* [IN | OUT | INOUT] 参数名称 参数类型 [DEFAULT 缺省值], ... */ )
/* RESULT( 列名 列类型, ... ) */
BEGIN
declare @ee varchar(500);
declare @ee1 varchar(500);
declare @……
[/Quote]

不好意思啊,上面的代码比较乱,看起来不是很清楚。能麻烦按照我的那个需求简单写一下么?谢谢。
wwwwb 2011-06-21
  • 打赏
  • 举报
回复
示例,自行修改
ALTER PROCEDURE "zz"."blljtest"( /* [IN | OUT | INOUT] 参数名称 参数类型 [DEFAULT 缺省值], ... */ )
/* RESULT( 列名 列类型, ... ) */
BEGIN
declare @ee varchar(500);
declare @ee1 varchar(500);
declare @num int;
set @ee='';
set @ee1='';
set @num=1;
select *,space(500) as gd,0000 as gdnum into #tt from blljtest;
update #tt set gd=(case when @ee1=class then @ee || ',' || name else name end) ,
@ee=(case when @ee1=class then @ee || ',' || name else name end),
gdnum=(case when @ee1=class then @num+1 else 1 end),
@num=(case when @ee1=class then @num+1 else 1 end),@ee1=class;
select a.* from #tt a inner join
(select class,max(gdnum) as ma from #tt group by class) b
on a.class=b.class and a.gdnum=ma;
end
sn_tiantian 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wwwwb 的回复:]

是ASA还是ASE?前者可以用LIST函数,后者要用变量累计的方法
[/Quote]

是ASE的。现在为了实现这个功能,我在存储过程中用游标去实现,这样我担心效率会比较差(特别是在处理海量数据的时候)。你说的使用变量累计的方法,能说的详细点么?最好能简单写一下,因为我之前没怎么用过Sybase。谢谢了。
wwwwb 2011-06-21
  • 打赏
  • 举报
回复
是ASA还是ASE?前者可以用LIST函数,后者要用变量累计的方法

2,598

社区成员

发帖
与我相关
我的任务
社区描述
Sybase相关技术讨论区
社区管理员
  • Sybase社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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