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

51

我有一个名为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查询语句 :)


1
相关问题(适用于其他有相同问题的人):https://dev59.com/AnVD5IYBdhLWcg3wE3No - Eduardo Molteni
我来晚了,但是看看这个 - 最干净的方法 - Mārtiņš Radiņš
1
SqlServer 2017现在拥有STRING_AGG函数,可以使用给定的分隔符将多个字符串聚合成一个。 - John
6个回答

61
您可以使用带有 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

在这种情况下,如果我在UserAliases表中使用order by case,我可以尝试但没有成功,如果有另一种方法在select语句中使用"order by alias",请提供任何解决方案...拜托了... - Sagar Rawal
我知道这是老问题了,但我们如何将其默认设置为按升序排序呢?它似乎总是以降序出现。 - IeeTeY

21

嗯...我看到已经有一个答案被接受了...但我觉得你应该看看其他解决方案:

/* 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    
*/

1
DECLARE @Str varchar(500)

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

SELECT @Str

0

1
这个问题针对的是MS-SQL。 - pointernil
但是答案包含了如何在MySQL中找到类似函数的信息。 - Kevin Peno

0

你可以使用游标循环遍历行并将其附加到临时表中的字段,或者你可以使用COALESCE函数来连接这些字段。


0

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

declare @result varchar(max)

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接