Вывести разделенный запятыми список в T-SQL - PullRequest
6 голосов
/ 13 мая 2011

У меня есть таблица с номерами телефонов. Вместо того, чтобы выделять одну строку для каждого номера, я хочу вернуть список телефонных номеров через запятую. Какой самый простой способ сделать это в SQL? Цикл while?

Ответы [ 7 ]

9 голосов
/ 13 мая 2011

Некоторые из этих ответов слишком сложны из-за слияния и более сложных запросов XML. Я использую это все время:

select @Phones=(
  Select PhoneColumn+','
  From TableName
  For XML Path(''))
-- Remove trailing comma if necessary
select @Phones=left(@Phones,len(@Phones)-1)
3 голосов
/ 13 мая 2011

Вы можете создать 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

В основном это просто вытягивает все значения в простой список.

1 голос
/ 14 мая 2011

Предполагая, что у вас есть таблица «Клиенты» с уникальным идентификатором, а другая таблица с именем «Номера телефонов» с несколькими телефонными номерами для каждого клиента, совместно использующего поле «Идентификатор клиента» в качестве внешнего ключа, это будет работать с использованием коррелированного подзапроса

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
1 голос
/ 13 мая 2011

FWIW Я создал функцию агрегирования SQL CLR.Работает как чемпион!

[Сериализуемый] [SqlUserDefinedAggregate (Format.UserDefined, Name = "JoinStrings", IsInvariantToNulls = true, IsInvariantToDuplicates = false, IsInvariantToOrder = false, structStrings 8000S) =: 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
1 голос
/ 13 мая 2011

Смотрите мой ответ на этот вопрос .В этом вопросе также есть несколько других способов сделать это.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
0 голосов
/ 05 августа 2014
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

Надеюсь, это то, что вы ищете, и я не знаю, поможет ли это вам до сих пор после вопроса.

0 голосов
/ 13 мая 2011

Этот вопрос имеет несколько хороших вариантов. Я на самом деле ссылался на тот же вопрос и реализовал один или несколько этих ответов.

Здесь - еще один набор хороших вариантов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...