打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
SQL SERVER:select 字符串拼接问题
一、问题

 

 select UserID,LastName,FirstName,UserName From SYSUser

UserID LastName FirstName UserName
------------------------------------------------------
                 C
     A1      B1        C1
     A2      B2        C2

 

  我想把这个select出来的纪录集拼接成一个字符串。应该怎么实现?例如:

 

 strUserName=C,c2,c2

 

 

  二、解决

  SQL code问题描述:无论是在sql 2000,还是在 SQL 2005中,都没有提供字符串的聚合函数,所以,当我们在处理下列要求时,会比较麻烦:

  有表tb, 如下:

 

 id    value
----- ------
    aa
    bb
    aaa
    bbb
    ccc

需要得到结果:

 

 

 id     values
------ -----------
     aa,bb
     aaa,bbb,ccc

 

  即, group by id, 求 value 的和(字符串相加)

  方法1、 旧的解决方法

 

-- 1. 创建处理函数
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, values=dbo.f_str(id)
FROM tb
GROUP BY id

 

 

  方法2、新的解决方法

  1、示例数据

 

DECLARE @t TABLE(id int, value varchar(10))
INSERT @t SELECT 1, 'aa'
UNION ALL SELECT 1, 'bb'
UNION ALL SELECT 2, 'aaa'
UNION ALL SELECT 2, 'bbb'
UNION ALL SELECT 2, 'ccc'

  2、查询处理 

 

 

SELECT * FROM(
    SELECT DISTINCT id
    FROM @t
)A
OUTER APPLY(
    SELECT
        [values]= STUFF(REPLACE(REPLACE(
            (
                SELECT value FROM @t N
                WHERE id = A.id
                FOR XML AUTO
            ), '<N value="', ','), '"/>', ''), 1, 1, '')
)N
 

  3、结果 

 

 

 id          values
----------- ----------------
          aa,bb
          aaa,bbb,ccc
(2 行受影响)

 


  三、各种字符串分函数

--3.3.1 使用游标法进行字符串合并处理的示例。
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3

--合并处理
--定义结果集表变量
DECLARE @t TABLE(col1 varchar(10),col2 varchar(100))

--定义游标并进行合并处理
DECLARE tb CURSOR LOCAL
FOR
SELECT col1,col2 FROM tb ORDER BY  col1,col2
DECLARE @col1_old varchar(10),@col1 varchar(10),@col2 int,@svarchar(100)
OPEN tb
FETCH tb INTO @col1,@col2
SELECT @col1_old=@col1,@s=''
WHILE @@FETCH_STATUS=0
BEGIN
    IF@col1=@col1_old
       SELECT @s=@s+','+CAST(@col2 as varchar)
    ELSE
    BEGIN
       INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
       SELECT @s=','+CAST(@col2 as varchar),@col1_old=@col1
    END
    FETCH tbINTO @col1,@col2
END
INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
CLOSE tb
DEALLOCATE tb
--显示结果并删除测试数据
SELECT * FROM @t
DROP TABLE tb

GO



--3.3.2 使用用户定义函数,配合SELECT处理完成字符串合并处理的示例
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3
GO

--合并处理函数
CREATE FUNCTION dbo.f_str(@col1 varchar(10))
RETURNS varchar(100)
AS
BEGIN
    DECLARE @revarchar(100)
    SET@re=''
    SELECT@re=@re+','+CAST(col2 as varchar)
    FROMtb
    WHEREcol1=@col1
   RETURN(STUFF(@re,1,1,''))
END
GO

--调用函数
SELECT col1,col2=dbo.f_str(col1) FROM tb GROUP BY col1
--删除测试
DROP TABLE tb
DROP FUNCTION f_str

GO

 


--3.3.3 使用临时表实现字符串合并处理的示例
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3

--合并处理
SELECT col1,col2=CAST(col2 as varchar(100))
INTO #t FROM tb
ORDER BY col1,col2
DECLARE @col1 varchar(10),@col2 varchar(100)
UPDATE #t SET
    @col2=CASEWHEN @col1=col1 THEN @col2+','+col2 ELSE col2 END,
   @col1=col1,
    col2=@col2
SELECT * FROM #t

--得到最终结果
SELECT col1,col2=MAX(col2) FROM #t GROUP BY col1

--删除测试
DROP TABLE tb,#t
GO


--3.3.4.1 每组 <=2 条记录的合并
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'c',3

--合并处理
SELECT col1,
   col2=CAST(MIN(col2) as varchar)
       +CASE
           WHEN COUNT(*)=1 THEN ''
           ELSE ','+CAST(MAX(col2) as varchar)
       END
FROM tb
GROUP BY col1
DROP TABLE tb

--3.3.4.2 每组 <=3 条记录的合并
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3
UNION ALL SELECT 'c',3

--合并处理
SELECT col1,
   col2=CAST(MIN(col2) as varchar)
       +CASE
           WHEN COUNT(*)=3 THEN ','
               +CAST((SELECT col2 FROM tb WHERE col1=a.col1 AND col2 NOTIN(MAX(a.col2),MIN(a.col2))) as varchar)
           ELSE ''
       END
       +CASE
           WHEN COUNT(*)>=2 THEN ','+CAST(MAX(col2) asvarchar)
           ELSE ''
       END
FROM tb a
GROUP BY col1
DROP TABLE tb

GO
if not object_id('A') is null
    drop tableA
Go
Create table A([id] int,[cname] nvarchar(2))
Insert A
select 1,N'张三' union all
select 2,N'李四' union all
select 3,N'王五' union all
select 4,N'蔡六'
Go
--> -->
 
if not object_id('B') is null
    drop tableB
Go
Create table B([id] int,[cname] nvarchar(5))
Insert B
select 1,N'1,2,3' union all
select 2,N'3,4'
Go
create function F_str(@cname nvarchar(100))
returns nvarchar(100)
as
begin
select @cname=replace(@cname,ID,[cname]) from A wherepatindex('%,'+rtrim(ID)+',%',','+@cname+',')>0
return @cname
end
go
select [id],dbo.F_str([cname])[cname] from B

id         cname
---------------------------------------------------------------------------------------------------------------
         张三,李四,王五
         王五,蔡六

    .
[华 软 网]
编程论坛 2 个网友回答:

 

 

SQL code
DECLARE @STR VARCHAR(8000)
SELECT @STR=ISNULL(@STR+',','')+USERNAME FROM TB
SELECT @STR
    .
[华 软 网]
编程论坛 3 个网友回答:
SQL code
DECLARE @TB TABLE([UserID] INT, [LastName] VARCHAR(2), [FirstName]VARCHAR(2), [UserName] VARCHAR(2))
INSERT @TB
SELECT 1, 'A', 'B', 'C' UNION ALL
SELECT 2, 'A1', 'B1', 'C1' UNION ALL
SELECT 3, 'A2', 'B2', 'C2'

 

DECLARE @STR VARCHAR(8000)
SET @STR=''
SELECT @STR=@STR+','+[UserName]
FROM @TB

SELECT STUFF(@STR,1,1,'')

    .
[华 软 网]
编程论坛 4 个网友回答:
SQL code

--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 int) returns varchar(100)
as
begin
    declare @strvarchar(1000)
    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 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 whereid = 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) , @svarchar(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
    fetchmy_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

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
sqlserver中,如何把一列中的多行数据在一行显示
如何将一列中所有的值 一行显示(SQL)
精彩SQL收藏
SQL common keywords examples and tricks
如何修改表的ID主键 使的在删除了一些记录后把新增的记录插入到删除记录的位置
SQL Server根据子节点查询所有父节点的代码示例
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服