在单个查询中连接选定的列?

时间:2009-04-30 19:20:20

标签: sql sql-server select concatenation

我知道你可以做到这一点,因为我之前已经看过它,但我忘记了到现在为止我不需要这样做。

我有一个名为Employees的表,它有各种员工数据(duh)。我需要一个查询,它将对表中所有行的名字和姓氏进行选择,然后将它们全部置于逗号分隔的字符串中。

例如,我有几行(比实际上要多得多,但为了这个问题只假设两个),看起来像是这样的数据:

FName    LName
-------  -----
Richard  Prescott
Jill     Sentieri
Carol    Winger

我需要一个能够以这种形式返回上述数据的选择:

Richard Prescott, Jill Sentieri, Carol Winger

提前感谢您的帮助!

6 个答案:

答案 0 :(得分:7)

使用合并。像这样:

DECLARE @Names varchar(1000)
SELECT @Names = COALESCE(@Names + ', ', '') + Name
FROM Employees

答案 1 :(得分:2)

这是我发现的最有效的方法。它需要SQL Server,但听起来就像你正在使用的那样。

select stuff((
    select ', ' + fName + ' ' + lName
    from Employees
    order by lName, fName /* Optional */
    for xml path('')
), 1, 2, '');

这个想法是你可以利用为xml路径('')使用空标记名来跨行进行字符串连接的能力。东西(...,1,2,'')只删除了前导逗号。

这真的很快。

答案 2 :(得分:1)

你可以写一个UDF来做那个

CREATE FUNCTION [dbo].[fnc_GetEmpList](
@CompId numeric
) RETURNS nvarchar(1000)
BEGIN

declare @str nvarchar(1000)
set @str =''

select  @str = @str + ',' + FirstName + ' ' + LastName from Employees


--remove the last comma
if(@str<>'')
    set @str = right(@str,len(@str)-1)

return @str


END

答案 3 :(得分:0)

答案 4 :(得分:0)

如果您使用的是MySQL,那么它们就有一个名为GROUP_CONCAT的强大功能。 http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

答案 5 :(得分:0)

这不是完美的,但它会让你大部分都在那里

declare @count int
declare @i int
declare @string nvarchar(max)
declare @name nvarchar(100)

declare @Employees (EmpName nvarchar(100), ID int identity(1,1)

insert into @Employees (EmpName)
select FirstName + ' ' + LastName
from Employees


select @count=count(*) from @Employees
set @i=1
set @string=''


while (@i<=@count)
begin

    select @name = EmpName from @Employees where ID=@i

    set @string = @string + ',' + @name

    set @i=@i+1
end