una texto string_split separar por espacios dividir delimitada comas columnas charindex caracter cadena buscar tsql rows csv

tsql - texto - string_split



Convierta varias filas en una con comas como separador (10)

Si SELECT username FROM Users obtengo este resultado:

username -------- Paul John Mary

pero lo que realmente necesito es una fila con todos los valores separados por coma, como este:

Paul, John, Mary

¿Cómo hago esto?


En SQLite esto es más simple. Creo que hay implementaciones similares para MySQL, MSSql y Orable

CREATE TABLE Beatles (id integer, name string ); INSERT INTO Beatles VALUES (1, "Paul"); INSERT INTO Beatles VALUES (2, "John"); INSERT INTO Beatles VALUES (3, "Ringo"); INSERT INTO Beatles VALUES (4, "George"); SELECT GROUP_CONCAT(name, '','') FROM Beatles;


Esto debería funcionar para ti. Probado todo el camino de vuelta a SQL 2000.

create table #user (username varchar(25)) insert into #user (username) values (''Paul'') insert into #user (username) values (''John'') insert into #user (username) values (''Mary'') declare @tmp varchar(250) SET @tmp = '''' select @tmp = @tmp + username + '', '' from #user select SUBSTRING(@tmp, 0, LEN(@tmp))



Si estás ejecutando esto a través de PHP, ¿qué tal esto?

$hQuery = mysql_query("SELECT * FROM users"); while($hRow = mysql_fetch_array($hQuery)) { $hOut .= $hRow[''username''] . ", "; } $hOut = substr($hOut, 0, strlen($hOut) - 1); echo $hOut;


Una solución limpia y flexible en MS SQL Server 2005/2008 es crear una función CLR Agregate.

Encontrarás bastantes artículos (con código) en google .

Parece que este artículo lo guía a través de todo el proceso usando C #.


basándose en la respuesta de mwigdahls. Si también necesita agrupar aquí, ¿cómo lograr que se vea como

group, csv ''group1'', ''paul, john'' ''group2'', ''mary'' --drop table #user create table #user (groupName varchar(25), username varchar(25)) insert into #user (groupname, username) values (''apostles'', ''Paul'') insert into #user (groupname, username) values (''apostles'', ''John'') insert into #user (groupname, username) values (''family'',''Mary'') select g1.groupname , stuff(( select '', '' + g.username from #user g where g.groupName = g1.groupname order by g.username for xml path('''') ),1,2,'''') as name_csv from #user g1 group by g1.groupname


buena revisión de varios enfoques:

http://blogs.msmvps.com/robfarley/2007/04/07/coalesce-is-not-the-answer-to-string-concatentation-in-t-sql/

Copia del artículo

Coalesce no es la respuesta a la concatenación de cadenas en T-SQL. He visto muchas publicaciones a lo largo de los años sobre el uso de la función COALESCE para que la concatenación de cadenas funcione en T-SQL. Este es uno de los ejemplos aquí (tomado de Readifarian Marc Ridey).

DECLARE @categories varchar(200) SET @categories = NULL SELECT @categories = COALESCE(@categories + '','','''') + Name FROM Production.ProductCategory SELECT @categories

Esta consulta puede ser bastante efectiva, pero se debe tener cuidado, y se debe entender correctamente el uso de COALESCE. COALESCE es la versión de ISNULL que puede tomar más de dos parámetros. Devuelve lo primero en la lista de parámetros que no es nulo. Entonces realmente no tiene nada que ver con la concatenación, y el siguiente fragmento de código es exactamente el mismo, sin usar COALESCE:

DECLARE @categories varchar(200) SET @categories = '''' SELECT @categories = @categories + '','' + Name FROM Production.ProductCategory SELECT @categories

Pero la naturaleza desordenada de las bases de datos hace que esto no sea confiable. El motivo por el cual T-SQL no (todavía) tiene una función de concatenación es que este es un agregado para el cual el orden de los elementos es importante. Al utilizar este método de asignación de variables de la concatenación de cadenas, es posible que descubra que la respuesta que se devuelve no tiene todos los valores, especialmente si desea que las subcadenas se coloquen en un orden determinado. Considere lo siguiente, que en mi máquina solo devuelve '', Accesorios'', cuando quería que volviera '', Bicicletas, Ropa, Componentes, Accesorios'':

DECLARE @categories varchar(200) SET @categories = NULL SELECT @categories = COALESCE(@categories + '','','''') + Name FROM Production.ProductCategory ORDER BY LEN(Name) SELECT @categories

Es mucho mejor utilizar un método que tenga en cuenta el orden, y que se haya incluido en SQL2005 específicamente para el propósito de la concatenación de cadenas: FOR XML PATH ('''')

SELECT '','' + Name FROM Production.ProductCategory ORDER BY LEN(Name) FOR XML PATH('''')

En la publicación que hice recientemente comparando GROUP BY y DISTINCT al usar subconsultas, demostré el uso de FOR XML PATH (''''). Eche un vistazo a esto y verá cómo funciona en una subconsulta. La función ''STUFF'' solo está ahí para eliminar la coma inicial.

USE tempdb; GO CREATE TABLE t1 (id INT, NAME VARCHAR(MAX)); INSERT t1 values (1,''Jamie''); INSERT t1 values (1,''Joe''); INSERT t1 values (1,''John''); INSERT t1 values (2,''Sai''); INSERT t1 values (2,''Sam''); GO select id, stuff(( select '','' + t.[name] from t1 t where t.id = t1.id order by t.[name] for xml path('''') ),1,1,'''') as name_csv from t1 group by id ;

FOR XML PATH es una de las únicas situaciones en las que puede usar ORDER BY en una subconsulta. El otro es TOP. Y cuando use una columna sin nombre y FOR XML PATH (''''), obtendrá una concatenación directa, sin etiquetas XML. Esto significa que las cadenas estarán codificadas en HTML, así que si estás concatenando cadenas que pueden tener el carácter </ font> (</ font>), entonces quizás debas arreglarlo luego, pero de cualquier forma, esta sigue siendo la mejor forma de concatenación de cadenas. en SQL Server 2005.


puede usar cosas () para convertir filas como valores separados por comas

select EmployeeID, stuff(( SELECT '','' + FPProjectMaster.GroupName FROM FPProjectInfo AS t INNER JOIN FPProjectMaster ON t.ProjectID = FPProjectMaster.ProjectID WHERE (t.EmployeeID = FPProjectInfo.EmployeeID) And t.STatusID = 1 ORDER BY t.ProjectID for xml path('''') ),1,1,'''') as name_csv from FPProjectInfo group by EmployeeID;

Gracias @AlexKuznetsov por la referencia para obtener esta respuesta.


select distinct stuff(( select '','' + u.username from users u where u.username = username order by u.username for xml path('''') ),1,1,'''') as userlist from users group by username

tenía un error tipográfico antes, el anterior funciona