在T-SQL中输出一个以逗号分隔的列表

问题描述:

我有一个包含电话号码的表格。我不想为每个号码吐出一行,而是想返回逗号分隔的电话号码列表。在sql中执行此操作最简单的方法是什么?一个while循环?在T-SQL中输出一个以逗号分隔的列表

+0

可能的重复[有没有办法创建一个SQL Server函数来“连接”从子查询到单个分隔字段的多行?](http://stackoverflow.com/questions/6899/is-there- a-way-to-create-a-sql-server-function-to-join-multiple-rows-from-a-sub) – 2011-05-13 18:31:15

+0

这个问题的基本思想已被多次提出。看看下面答案中提供的链接。 – TKTS 2011-05-13 18:36:37

+3

@TKTS - 如果这是SO上最猖獗的重复,我不会感到惊讶。似乎每天至少要问一次,有时候更多。 – 2011-05-13 18:38:04

This question有几个很好的选择。实际上我提到了同样的问题,并实施了一个或多个这些回应。

Here是另一组不错的选择。

看到我的回答从这个question。在这个问题中还有其他几种方法可以做到这一点。尽管如此,COALESCE或xml路径应该可以做到。

编辑(添加了来自前一个问题我的答案):

CREATE FUNCTION [dbo].[fn_MyFunction]()RETURNS NVARCHAR(MAX) 
AS 
BEGIN  
    DECLARE @str NVARCHAR(MAX)  
    DECLARE @Delimiter CHAR(2)  
    SET @Delimiter = ', '  
    SELECT @str = COALESCE(@str + @Delimiter,'') + AColumn  
    FROM dbo.myTable  
    RETURN RTRIM(LTRIM(@str)) 
END 

您可以创建一个UDF,会做这样的事情

CREATE FUNCTION dbo.GetBirthdays(@UserId INT) 
RETURNS VARCHAR(MAX) 
AS 
BEGIN 
DECLARE @combined VARCHAR(MAX) 
SELECT @combined = COALESCE(@combined + ', ' + colName + ', colName) 
FROM YourTable 
WHERE UserId = @UserId 
ORDER BY ColName 

END 

基本上这只是拉的所有值进入一个简单的列表。

其中一些答案过于复杂并且更复杂的XML查询。我一直用这个:

select @Phones=(
    Select PhoneColumn+',' 
    From TableName 
    For XML Path('')) 
-- Remove trailing comma if necessary 
select @Phones=left(@Phones,len(@Phones)-1) 

FWIW我创建了一个SQL CLR聚合函数。像冠军一样工作!

[序列化] [SqlUserDefinedAggregate(Format.UserDefined, 名称= “JoinStrings”, IsInvariantToNulls =真, IsInvariantToDuplicates =假, IsInvariantToOrder =假, MaxByteSize = 8000)]公共结构 JoinStrings: IBinarySerialize {0}公共字符串结果;

public void Init() 
{ 
    Result = ""; 
} 
public void Accumulate(SqlString value) 
{ 
    if (value.IsNull) 
     return; 

    Result += value.Value + ","; 

} 
public void Merge(JoinStrings Group) 
{ 
    Result += Group.Result; 
} 

public SqlString Terminate() 
{ 
    return new SqlString(Result.ToString().Trim(new 

char [] {','})); }

public void Read(System.IO.BinaryReader r) 
{ 
    Result = r.ReadString(); 
} 

public void Write(System.IO.BinaryWriter w) 
{ 
    w.Write(Result.ToString()); 
} } 

然后我就可以这样使用它:

SELECT dbo.JoinStrings(Phone) FROM Phones Where UserID = XXX 

假设你有其中有一个唯一的ID,并命名为多个电话号码PHONENUMBERS为每一个客户共享的另一表中的客户表客户ID字段作为外键,这将使用相关的子查询

Select C.ID, C.FirstName, C.LastName, 
(select (STUFF((SELECT ', ' + PhoneNumber from PhoneNumbers P where P.CID = C.ID 
FOR XML PATH('')), 1, 2, ''))) as PhoneNumbers 
from Customers C 

Select Unique ID, Replace(Rtrim(Ltrim(Case when [Phone_Number1] is not null Then [Phone_Number1]+' ' Else '' End + 
        Case when [Phone_Number2] is not null Then [Phone_Number2]+' ' Else '' End + 
        Case when [Phone_Number3] is not null Then [Phone_Number3]+' ' Else '' End)),' ',', ') as Phone_numbers 

From MYTable 

希望这是你正在寻找的东西,我不知道这是否会帮助你到目前为止的问题。