2011-05-13 94 views
6

我有一個包含電話號碼的表格。我不想爲每個號碼吐出一行,而是想返回逗號分隔的電話號碼列表。在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

回答

0

This question有幾個很好的選擇。實際上我提到了同樣的問題,並實施了一個或多個這些迴應。

Here是另一組不錯的選擇。

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

您可以創建一個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 

基本上這只是拉的所有值進入一個簡單的列表。

9

其中一些答案過於複雜並且更復雜的XML查詢。我一直用這個:

select @Phones=(
    Select PhoneColumn+',' 
    From TableName 
    For XML Path('')) 
-- Remove trailing comma if necessary 
select @Phones=left(@Phones,len(@Phones)-1) 
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 
1

假設你有其中有一個唯一的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 
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 

希望這是你正在尋找的東西,我不知道這是否會幫助你到目前爲止的問題。