2009-04-30 24 views
1

我知道你可以做到這一點,因爲我以前見過它,但我忘記了從哪裏開始到現在,我不需要這樣做。在單個查詢中連接選定的列?

我有一個名爲Employees的表,它有各種員工數據(duh)。我需要一個查詢,它將對錶中所有行的名字和姓氏進行選擇,然後將它們全部變爲逗號分隔的字符串。

例如,我有幾個行(比實際多了不少,但對於這個問題的目的只是假設二)看起來像數據:

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

我需要一個選擇可以用以下格式返回上述數據:

Richard Prescott, Jill Sentieri, Carol Winger

預先感謝您的幫助!

+1

您正在使用哪種RDBMS?另外,你想要這樣做的理由是什麼?這可能是在您的應用程序的前端處理得更好的東西。 – 2009-04-30 19:29:06

+0

這是用於使用SQL Server報告服務的報告。 – Jagd 2009-04-30 19:47:34

回答

7

使用coalesce。像這樣:

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

是否有任何理由使用COALESCE只是一個正常的「select @str = @str +','+ FirstName +''+ LastName」? 我做了一些閱讀,我能找到的唯一附加好處是COALESCE將忽略空條目。 – Jagd 2009-04-30 20:18:20

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 
+0

可重複使用!我喜歡。 :) – Jagd 2009-04-30 20:09:03

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<[email protected]) 
begin 

    select @name = EmpName from @Employees where [email protected] 

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

    set @[email protected]+1 
end 
2

這是最有效的方法,我發現。它需要SQL Server,但聽起來就像你正在使用的那樣。

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

的想法是,你可以採取使用空標籤名稱與XML路徑(「」)跨行獲得字符串連接的能力優勢。這些東西(...,1,2,'')只是刪除了前面的逗號。

這是非常快的。