Sql 是否在单个查询中连接选定列?

Sql 是否在单个查询中连接选定列?,sql,sql-server,select,concatenation,Sql,Sql Server,Select,Concatenation,我知道你能做到这一点,因为我以前看过一次,但我忘了在哪里,直到现在我还不需要做 我有一个名为Employees的表,它有各种各样的员工数据duh。我需要一个查询,该查询将对表中所有行的名字和姓氏进行选择,然后将所有行内容化为逗号分隔的字符串 例如,实际上我有几行远不止这些,但是为了这个问题,假设两个数据如下: FName LName ------- ----- Richard Prescott Jill Sentieri Carol Winger 我需要选择一个可以以这种

我知道你能做到这一点,因为我以前看过一次,但我忘了在哪里,直到现在我还不需要做

我有一个名为Employees的表,它有各种各样的员工数据duh。我需要一个查询,该查询将对表中所有行的名字和姓氏进行选择,然后将所有行内容化为逗号分隔的字符串

例如,实际上我有几行远不止这些,但是为了这个问题,假设两个数据如下:

FName LName ------- ----- Richard Prescott Jill Sentieri Carol Winger 我需要选择一个可以以这种形式返回上述数据的选项:

Richard Prescott, Jill Sentieri, Carol Winger
提前感谢您的帮助

您可以编写一个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

您可以编写一个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

也许这会有帮助。这个问题以前有人问过。

也许这会有所帮助。这个问题以前有人问过。
使用聚结。大概是这样的:

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

使用合并。大概是这样的:

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

如果您使用的是MySQL,那么它们有一个名为GROUP_CONCAT的强大功能,可以实现这一点

如果您使用的是MySQL,它们有一个很棒的函数,名为GROUP_CONCAT,可以实现这一点

这并不完美,但它能帮你实现大部分目标

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

这并不完美,但它会让你在大部分的道路上

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

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

select stuff((
    select ', ' + fName + ' ' + lName
    from Employees
    order by lName, fName /* Optional */
    for xml path('')
), 1, 2, '');
其思想是,您可以利用将空标记名与for xml path一起使用的功能来跨行实现字符串连接。东西…,1,2,只是去掉了前面的逗号


这真的很快。

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

select stuff((
    select ', ' + fName + ' ' + lName
    from Employees
    order by lName, fName /* Optional */
    for xml path('')
), 1, 2, '');
其思想是,您可以利用将空标记名与for xml path一起使用的功能来跨行实现字符串连接。东西…,1,2,只是去掉了前面的逗号


这真的很快。

您正在使用哪些RDBMS?还有,你想这样做的原因是什么?它可能在应用程序前端处理得更好。它用于使用SQL Server reporting services的报表。您使用的是哪种RDBMS?还有,你想这样做的原因是什么?它可能在应用程序的前端处理得更好。它适用于使用SQL Server reporting services的报表。是否有任何理由仅在普通的select@str=@str+'、'+FirstName+''+LastName上使用COALESCE??我做了一些阅读,我能发现的唯一的额外好处是COALESCE将忽略空条目。是的,如果没有COALESCE,您将在@str的开头使用一个额外的逗号。实际上,您也将使用COALESCE以一个前导逗号结束,除非您使用IsNull函数包装@Names变量。COALESCEIsNull@Names“+”,“,.Oops。。。让我们再试一次:coalesceIsNull@Names+“,”,null+'string'=null,因此如果@str在第一次传递时为null,则使用第二个字符串。嵌套的ISNULL将复制合并,因为它将始终使用第一个值@str+','或者有任何理由在普通select@str=@str+','+FirstName+''+LastName???上使用COALESCE吗??我做了一些阅读,我能发现的唯一的额外好处是COALESCE将忽略空条目。是的,如果没有COALESCE,您将在@str的开头使用一个额外的逗号。实际上,您也将使用COALESCE以一个前导逗号结束,除非您使用IsNull函数包装@Names变量。COALESCEIsNull@Names“+”,“,.Oops。。。让我们再试一次:coalesceIsNull@Names+“,”,null+'string'=null,因此如果@str在第一次传递时为null,则使用第二个字符串。嵌套的ISNULL将复制合并,因为它将始终使用第一个值@str+'、'或