2011-05-13 14 views
6

Tengo una tabla con números de teléfono. En lugar de escupir una sola fila para cada número, quiero devolver una lista de números de teléfono separados por comas. ¿Cuál es la forma más fácil de hacer esto en sql? ¿Un ciclo while?Imprime una lista separada por comas en T-SQL

+0

posible duplicado de [¿Hay alguna manera de crear una función de SQL Server para "unir" varias filas de una subconsulta en un único campo delimitado?] (Http://stackoverflow.com/questions/6899/is-there- a-way-to-create-a-sql-server-function-to-join-multiple-rows-from-a-sub) –

+0

La idea básica de esta pregunta se ha formulado varias veces. Eche un vistazo a los enlaces proporcionados en las respuestas a continuación. – TKTS

+3

@TKTS - No me sorprendería si este es el duplicado más desenfrenado en SO. Parece que se pregunta al menos una vez al día, a veces con más frecuencia. –

Respuesta

0

This question tiene muchas buenas opciones. De hecho, me he referido a la misma pregunta e implementado una o más de esas respuestas.

Here es otro conjunto de buenas opciones.

1

Ver mi respuesta de este question. Hay otras maneras de hacerlo enumeradas en esa pregunta también. COALESCE o para xml path deberían hacer el truco sin embargo.

Editar (añadió mi respuesta a la pregunta anterior):

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

Se puede crear una UDF que hacer algo como esto

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 

Básicamente esto sólo tira de todos los valores en una lista simple.

9

Algunas de esas respuestas son demasiado complicadas con consultas XML más complejas y más complejas. Lo uso todo el tiempo:

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

FWIW Creé una función SQL CLR Aggregate. Funciona como un campeón!

[Serializable] [ SqlUserDefinedAggregate (Format.UserDefined, name = "", JoinStrings IsInvariantToNulls = true, IsInvariantToDuplicates = false, IsInvariantToOrder = false, MaxByteSize = 8000)] public struct JoinStrings: IBinarySerialize { secuencia pública Resultado;

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()); 
} } 

puedo entonces utilizar de esta manera:

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

Asumiendo que tiene una tabla de clientes que tiene un identificador único y otra tabla llamada PHONENUMBERS con varios números de teléfono para cada reparto de la clientela el campo ID de cliente como clave externa esto funcionaría usando una sub-consulta correlacionada

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 

Espero que esto es lo que está buscando y no sé si esto lo ayudará hasta ahora después de la pregunta.

Cuestiones relacionadas