在T-SQL中输出逗号分隔列表

时间:2011-05-13 18:29:06

标签: sql tsql sql-server-2008

我有一张带有电话号码的表格。我没有为每个号码吐出一行,而是返回逗号分隔的电话号码列表。在sql中最简单的方法是什么?一个循环?

7 个答案:

答案 0 :(得分:9)

其中一些答案因合并和更复杂的XML查询而过于复杂。我一直都在用这个:

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

答案 1 :(得分:3)

您可以创建一个可以执行此类操作的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

基本上,这只是将所有值都拉到一个简单的列表中。

答案 2 :(得分:1)

请参阅此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

答案 3 :(得分:1)

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

  

[序列化]   [SqlUserDefinedAggregate(Format.UserDefined,   Name =“JoinStrings”,   IsInvariantToNulls = TRUE,   IsInvariantToDuplicates =假,   IsInvariantToOrder =假,   MaxByteSize = 8000)]公共结构   JoinStrings:IBinarySerialize {       public string Result;

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

答案 4 :(得分:1)

假设您有一个具有唯一ID的Customers表和另一个名为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

答案 5 :(得分:0)

This question有几个不错的选择。我实际上已经提到了同样的问题,并实施了一个或多个回复。

Here是另一套好的选择。

答案 6 :(得分:0)

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

希望这是你正在寻找的东西,我不知道在这个问题之后这对你是否会有所帮助。

相关问题