1701 votos

¿Concatenar muchas filas en una sola cadena de texto?

Considere una tabla de base de datos que contiene nombres, con tres filas:

Peter
Paul
Mary

¿Hay alguna manera fácil de convertir esto en una sola cadena de Peter, Paul, Mary ?

949voto

Chris Shaffer Puntos 18066

Utilice COALESCE :

DECLARE @Names VARCHAR(8000) 
SELECT @Names = COALESCE(@Names + ', ', '') + Name 
FROM People

Sólo una explicación (ya que esta respuesta parece recibir visitas con relativa regularidad):

  • Coalesce es en realidad un útil truco que logra dos cosas:

1) No es necesario inicializar @Names con un valor de cadena vacía.

2) No es necesario quitar un separador extra al final.

  • La solución anterior dará resultados incorrectos si una fila tiene un NULL Valor del nombre (si hay un NULL El NULL hará @Names NULL después de esa fila, y la siguiente fila comenzará de nuevo como una cadena vacía. Se arregla fácilmente con una de las dos soluciones:

    DECLARE @Names VARCHAR(8000) SELECT @Names = COALESCE(@Names + ', ', '') + Name FROM People WHERE Name IS NOT NULL

o:

DECLARE @Names VARCHAR(8000) 
SELECT @Names = COALESCE(@Names + ', ', '') + 
    ISNULL(Name, 'N/A')
FROM People

Dependiendo del comportamiento que desee (la primera opción sólo filtra los *NULL*, la segunda los mantiene en la lista con un mensaje de marcador [sustituya 'N/A' por lo que sea apropiado para usted]).

334voto

jens frandsen Puntos 709

Un método que aún no se muestra a través del comando XML data() en MS Sql Server es:

Supongamos una tabla llamada NameList con una columna llamada FName,

select FName + ', ' as 'data()' 
from NameList 
for xml path('')

vuelve: "Peter, Paul, Mary".

Sólo hay que ocuparse de la coma que sobra.

267voto

Steven Chong Puntos 320

En Sql Server 2005 ...

SELECT Stuff(
  (SELECT N', ' + Name FROM Names FOR XML PATH(''),TYPE)
  .value('text()[1]','nvarchar(max)'),1,2,N'')

111voto

Darryl Hein Puntos 33819

En MySQL existe una función, GROUP_CONCAT() que permite concatenar los valores de varias filas. Ejemplo:

SELECT 1 AS a, GROUP_CONCAT(name ORDER BY name ASC SEPARATOR ', ') AS people 
FROM users 
WHERE id IN (1,2,3) 
GROUP BY a

47voto

hgmnz Puntos 7239

Las matrices de Postgres son increíbles. Ejemplo:

Cree algunos datos de prueba:

postgres=# \c test
You are now connected to database "test" as user "hgimenez".
test=# create table names (name text);
CREATE TABLE                                      
test=# insert into names (name) values ('Peter'), ('Paul'), ('Mary');                                                          
INSERT 0 3
test=# select * from names;
 name  
-------
 Peter
 Paul
 Mary
(3 rows)

Agrégalos en un Array:

test=# select array_agg(name) from names;
 array_agg     
------------------- 
 {Peter,Paul,Mary}
(1 row)

Convierte la matriz en una cadena delimitada por comas:

test=# select array_to_string(array_agg(name), ', ') from names;
 array_to_string
-------------------
 Peter, Paul, Mary
(1 row)

DONE

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X