sql server SELECT语句里拼接字符串的问题!

bbird_smile 2008-04-10 03:46:02
declare @Temp_table table (firstName nvarchar(20),
lastName nvarchar(20),
Parent nvarchar(500))
insert into @Temp_table values ('A','B','AB_1')
insert into @Temp_table values ('A','B','AB_2')
insert into @Temp_table values ('A','B','AB_3')
insert into @Temp_table values ('A','C','AC_1')
insert into @Temp_table values ('B','C','BC_1')

select * From @Temp_table

需要得到以下结果:
A B AB_1|||AB_2|||AB_3
A C AC_1
B C BC_1

即把firstName和lastName相同的Parent拼接起来(用'|||' 分开),合并到一行里去。
求这一SQL语句,最好不要用临时表然后循环的方法。
...全文
9969 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanyi_ 2011-10-15
  • 打赏
  • 举报
回复
很强大,以前还不知道可以自定义函数的。。。
yujie8409 2009-11-25
  • 打赏
  • 举报
回复
xuexiel
dawugui 2008-04-10
  • 打赏
  • 举报
回复

--以下为sql server 2000里面使用函数的方法。2005的方法见上。
create table Temp_table (firstName nvarchar(20), lastName nvarchar(20), Parent nvarchar(500))
insert into Temp_table values ('A','B','AB_1')
insert into Temp_table values ('A','B','AB_2')
insert into Temp_table values ('A','B','AB_3')
insert into Temp_table values ('A','C','AC_1')
insert into Temp_table values ('B','C','BC_1')
go

--创建一个合并的函数
create function f_hb(@firstName varchar(20), @lastName varchar(20))
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + '¦¦¦' + cast(Parent as varchar) from Temp_table where firstName = @firstName and lastName = @lastName
set @str = right(@str , len(@str) - 3)
return(@str)
End
go

--调用自定义函数得到结果:
select distinct firstName , lastName ,dbo.f_hb(firstName , lastName) as Parent from Temp_table

drop table Temp_table
drop function dbo.f_hb
bbird_smile 2008-04-10
  • 打赏
  • 举报
回复
谢谢了!!!潇洒老乌龟(爱新觉罗.毓华)
bbird_smile 2008-04-10
  • 打赏
  • 举报
回复
请问如何实现的呀?

[Quote=引用 2 楼 dawugui 的回复:]
sql 2000需要创建一个函数来实现。
[/Quote]
dawugui 2008-04-10
  • 打赏
  • 举报
回复
合并列值
原著:邹建
改编:爱新觉罗.毓华 2007-12-16 广东深圳

表结构,数据如下:
id value
----- ------
1 aa
1 bb
2 aaa
2 bbb
2 ccc

需要得到结果:
id values
------ -----------
1 aa,bb
2 aaa,bbb,ccc
即:group by id, 求 value 的和(字符串相加)

1. 旧的解决方法(在sql server 2000中只能用函数解决。)
--1. 创建处理函数
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 int)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @r varchar(8000)
SET @r = ''
SELECT @r = @r + ',' + value FROM tb WHERE id=@id
RETURN STUFF(@r, 1, 1, '')
END
GO

-- 调用函数
SELECt id, value = dbo.f_str(id) FROM tb GROUP BY id

drop table tb
drop function dbo.f_str

/*
id value
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
(所影响的行数为 2 行)
*/

--2、另外一种函数.
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 f_hb(@id int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + ',' + cast(value as varchar) from tb where id = @id
set @str = right(@str , len(@str) - 1)
return(@str)
End
go

--调用自定义函数得到结果:
select distinct id ,dbo.f_hb(id) as value from tb

drop table tb
drop function dbo.f_hb

/*
id value
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
(所影响的行数为 2 行)
*/

2. 新的解决方法(在sql server 2005中用OUTER APPLY等解决。)
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 * FROM(SELECT DISTINCT id FROM tb)A OUTER APPLY(
SELECT [values]= STUFF(REPLACE(REPLACE(
(
SELECT value FROM tb N
WHERE id = A.id
FOR XML AUTO
), '<N value="', ','), '"/>', ''), 1, 1, '')
)N
drop table tb

/*
id values
----------- -----------
1 aa,bb
2 aaa,bbb,ccc

(2 行受影响)
*/
dawugui 2008-04-10
  • 打赏
  • 举报
回复
sql 2000需要创建一个函数来实现。
正宗老冉 2008-04-10
  • 打赏
  • 举报
回复
建议在前台页面里搞,不要直接在后台处理用户界面问题。
CTE

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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