如何在一列中返回多个值(T-SQL)?

时间:2008-09-23 18:43:44

标签: sql sql-server sql-server-2005 tsql

我有一个表UserAliasesUserId, Alias),每个用户有多个别名。我需要查询它并返回给定用户的所有别名,诀窍是将它们全部返回到一列。

示例:

UserId/Alias  
1/MrX  
1/MrY  
1/MrA  
2/Abc  
2/Xyz

我希望查询结果采用以下格式:

UserId/Alias  
1/ MrX, MrY, MrA  
2/ Abc, Xyz

谢谢。

我正在使用SQL Server 2005。

P.S。实际的T-SQL查询将不胜感激:)

9 个答案:

答案 0 :(得分:55)

您可以使用COALESCE的功能。

CREATE FUNCTION [dbo].[GetAliasesById]
(
    @userID int
)
RETURNS varchar(max)
AS
BEGIN
    declare @output varchar(max)
    select @output = COALESCE(@output + ', ', '') + alias
    from UserAliases
    where userid = @userID

    return @output
END

GO

SELECT UserID, dbo.GetAliasesByID(UserID)
FROM UserAliases
GROUP BY UserID

GO

答案 1 :(得分:17)

嗯......我看到答案已被接受......但我认为你应该看到另一种解决方案:

/* EXAMPLE */
DECLARE @UserAliases TABLE(UserId INT , Alias VARCHAR(10))
INSERT INTO @UserAliases (UserId,Alias) SELECT 1,'MrX'
     UNION ALL SELECT 1,'MrY' UNION ALL SELECT 1,'MrA'
     UNION ALL SELECT 2,'Abc' UNION ALL SELECT 2,'Xyz'

/* QUERY */
;WITH tmp AS ( SELECT DISTINCT UserId FROM @UserAliases )
SELECT 
    LEFT(tmp.UserId, 10) +
    '/ ' +
    STUFF(
            (   SELECT ', '+Alias 
                FROM @UserAliases 
                WHERE UserId = tmp.UserId 
                FOR XML PATH('') 
            ) 
            , 1, 2, ''
        ) AS [UserId/Alias]
FROM tmp

/* -- OUTPUT
  UserId/Alias
  1/ MrX, MrY, MrA
  2/ Abc, Xyz    
*/

答案 2 :(得分:3)

查看this thread already on StackOverflow,它可以方便地为您提供T-SQL示例。

答案 3 :(得分:3)

这是在不需要UDF的情况下完成所需操作的最快速,最简单的方法之一: http://weblogs.sqlteam.com/mladenp/archive/2007/06/01/60220.aspx

使用数字表的另一种方法对于真正大型的数据集更快,但我认为你不需要它。

答案 4 :(得分:2)

我的老板在2003年以这种方式撰写了一篇文章:Concatenation with COALESCE

答案 5 :(得分:1)

DECLARE @Str varchar(500)

SELECT @Str=COALESCE(@Str,'') + CAST(ID as varchar(10)) + ','
FROM dbo.fcUser

SELECT @Str

答案 6 :(得分:0)

您可以使用游标循环遍历行并附加到临时表中的字段,也可以使用COALESCE函数来连接字段。

答案 7 :(得分:0)

抱歉,第一次读错了。你可以这样做:

declare @result varchar(max)

--must "initialize" result for this to work
select @result = ''

select @result = @result + alias
FROM aliases
WHERE username='Bob'

答案 8 :(得分:-1)

group_concat()听起来就像你要找的那样。

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

因为你在mssql上,我只是用Google搜索“group_concat mssql”并找到一堆命中来重新创建group_concat功能。这是我发现的一个点击:

http://www.stevenmapes.com/index.php?/archives/23-Recreating-MySQL-GROUP_CONCAT-In-MSSQL-Cross-Tab-Query.html