Considere una tabla de base de datos con nombres, con tres filas:
Peter
Paul
Mary
¿Hay una manera fácil de convertir esto en una sola cadena de Peter, Paul, Mary
?
Considere una tabla de base de datos con nombres, con tres filas:
Peter
Paul
Mary
¿Hay una manera fácil de convertir esto en una sola cadena de Peter, Paul, Mary
?
Respuestas:
Si está utilizando SQL Server 2017 o Azure, consulte la respuesta de Mathieu Renda .
Tuve un problema similar cuando intentaba unir dos tablas con relaciones uno a muchos. En SQL 2005 descubrí que el
XML PATH
método puede manejar la concatenación de las filas muy fácilmente.Si hay una tabla llamada
STUDENTS
El resultado que esperaba era:
Usé lo siguiente
T-SQL
:Puede hacer lo mismo de una manera más compacta si puede concatenar las comas al principio y usar
substring
para omitir la primera, por lo que no necesita hacer una subconsulta:fuente
<
o&
. Ver el comentario de @ BenHinman.FOR XML PATH ('')
. Eso significa que no debe considerarse confiable ya que cualquier parche o actualización podría alterar cómo funciona esto. Básicamente se basa en una característica obsoleta.FOR XML
está destinada a generar XML, no concatenar cadenas arbitrarias. Es por eso que se escapa&
,<
y>
los códigos de entidad XML (&
,<
,>
). Supongo que también escapará"
y'
hacia"
y'
en los atributos también. Está noGROUP_CONCAT()
,string_agg()
,array_agg()
,listagg()
, etc, incluso si usted puede tipo de maquillaje que hacer eso. Nosotros deberíamos estar gastando nuestro tiempo exigiendo Microsoft implementar una función adecuada.string_agg
en v.Next. Y todo esto puede desaparecer.Uso
COALESCE
:Solo una explicación (ya que esta respuesta parece obtener vistas relativamente regulares):
1) No es necesario inicializar
@Names
con un valor de cadena vacío.2) No es necesario quitar un separador adicional al final.
@Names
NULL después de esa fila, y la siguiente fila comenzará de nuevo como una cadena vacía de nuevo. Se soluciona fácilmente con uno de dos soluciones:o:
Dependiendo del comportamiento que desee (la primera opción solo filtra los NULL , la segunda opción los mantiene en la lista con un mensaje marcador [reemplace 'N / A' con lo que sea apropiado para usted]).
fuente
SQL Server 2017+ y SQL Azure: STRING_AGG
Comenzando con la próxima versión de SQL Server, finalmente podemos concatenar entre filas sin tener que recurrir a ninguna brujería variable o XML.
STRING_AGG (Transact-SQL)
Sin agrupar
Con agrupación:
Con agrupación y subclasificación
fuente
Un método que aún no se muestra a través del
XML
data()
comando en MS SQL Server es:Suponga que la tabla llamada NameList con una columna llamada FName,
devoluciones:
Solo se debe tratar la coma extra.
Editar: tal como se adoptó del comentario de @ NReilingh, puede usar el siguiente método para eliminar la coma final. Asumiendo los mismos nombres de tabla y columna:
fuente
+ ', '
, todavía agrega un solo espacio entre cada elemento concatenado.SELECT STUFF(REPLACE((SELECT '#!'+city AS 'data()' FROM #cityzip FOR XML PATH ('')),' #!',', '),1,2,'')
En SQL Server 2005
En SQL Server 2016
puedes usar la sintaxis FOR JSON
es decir
Y el resultado se convertirá
Esto funcionará incluso si sus datos contienen caracteres XML no válidos
el
'"},{"_":"'
es seguro porque si contenerte datos'"},{"_":"',
que se escapó a"},{\"_\":\"
Se puede reemplazar
', '
con cualquier separador de cadenasY en SQL Server 2017, Azure SQL Database
Puedes usar la nueva función STRING_AGG
fuente
<
,>
,&
, etc, queFOR XML PATH('')
se escapará automáticamente.En MySQL hay una función, GROUP_CONCAT () , que le permite concatenar los valores de varias filas. Ejemplo:
fuente
SEPARATOR '", "'
, extrañaré algunos caracteres al final de la última entrada. ¿Por qué puede suceder esto?CHAR
, debeGROUP_CONCAT( CAST(id AS CHAR(8)) ORDER BY id ASC SEPARATOR ',')
group_concat_max_len
Use COALESCE - Obtenga más información desde aquí
Para un ejemplo:
Luego escriba el siguiente código en el servidor SQL,
La salida sería:
fuente
Declare @Numbers AS Nvarchar(MAX)
y funcionó bien. ¿Puede explicar por qué recomienda no usarlo, por favor?Las matrices de Postgres son increíbles. Ejemplo:
Crea algunos datos de prueba:
Agréguelos en una matriz:
Convierta la matriz en una cadena delimitada por comas:
HECHO
Desde PostgreSQL 9.0 es aún más fácil .
fuente
select array_to_string(array_agg(name||'('||id||')'
Oracle 11g Release 2 es compatible con la función LISTAGG. Documentación aquí .
Advertencia
Tenga cuidado al implementar esta función si existe la posibilidad de que la cadena resultante supere los 4000 caracteres. Lanzará una excepción. Si ese es el caso, debe manejar la excepción o rodar su propia función que evita que la cadena unida supere los 4000 caracteres.
fuente
LISTAGG
funciona perfecto! Solo lea el documento vinculado aquí.wm_concat
eliminado de la versión 12c en adelante.En SQL Server 2005 y versiones posteriores, use la consulta a continuación para concatenar las filas.
fuente
<
o&
.No tengo acceso a un servidor SQL en casa, así que supongo que la sintaxis aquí, pero es más o menos:
fuente
SELECT @names = @names + CASE WHEN LEN(@names)=0 THEN '' ELSE ' ' END + Name FROM Names
SELECT @names = @names + ISNULL(' ' + Name, '')
Se sugirió una solución recursiva de CTE, pero no se proporcionó ningún código. El siguiente código es un ejemplo de un CTE recursivo. Tenga en cuenta que si bien los resultados se ajustan a la pregunta, los datos no bastante coincide con la descripción dada, como supongo que realmente desea estar haciendo esto en grupos de filas, no todas las filas de la tabla. Cambiarlo para que coincida con todas las filas de la tabla se deja como ejercicio para el lector.
fuente
name
columna en una cadena separada por comas para 4 grupos deid
s. A primera vista, creo que esto es más trabajo que lo que hacen la mayoría de las otras soluciones para SQL Server.Comenzando con PostgreSQL 9.0, esto es bastante simple:
En versiones anteriores a 9.0
array_agg()
se puede usar como se muestra en hgmnzfuente
SELECT string_agg(non_text_type::text, ',') FROM table
varchar
ochar
Necesita crear una variable que contendrá su resultado final y seleccionarlo, así.
La solución más fácil
fuente
En SQL Server vNext, esto se integrará con la función STRING_AGG, lea más sobre esto aquí: https://msdn.microsoft.com/en-us/library/mt790580.aspx
fuente
Usar XML me ayudó a separar las filas con comas. Para la coma adicional, podemos usar la función de reemplazo de SQL Server. En lugar de agregar una coma, el uso de AS 'data ()' concatenará las filas con espacios, que luego se pueden reemplazar con comas como la sintaxis escrita a continuación.
fuente
Una solución lista para usar, sin comas adicionales:
Una lista vacía dará como resultado un valor NULL. Por lo general, insertará la lista en una columna de tabla o variable de programa: ajuste la longitud máxima de 255 a su necesidad.
(Diwakar y Jens Frandsen dieron buenas respuestas, pero necesitan mejorar).
fuente
', '
con','
si no desea el espacio extra.Aquí hay una muestra:
fuente
Esto pone la coma perdida al principio.
Sin embargo, si necesita otras columnas o para CSV una tabla secundaria, debe ajustar esto en un campo escalar definido por el usuario (UDF).
También puede usar la ruta XML como una subconsulta correlacionada en la cláusula SELECT (pero tendría que esperar hasta volver a trabajar porque Google no hace cosas de trabajo en casa :-)
fuente
Con las otras respuestas, la persona que lee la respuesta debe conocer una tabla de dominio específica, como el vehículo o el estudiante. La tabla debe crearse y rellenarse con datos para probar una solución.
A continuación se muestra un ejemplo que utiliza la tabla "Information_Schema.Columns" de SQL Server. Al usar esta solución, no es necesario crear tablas ni agregar datos. Este ejemplo crea una lista separada por comas de nombres de columna para todas las tablas en la base de datos.
fuente
Para Oracle DBs, vea esta pregunta: ¿Cómo se pueden concatenar varias filas en una en Oracle sin crear un procedimiento almacenado?
La mejor respuesta parece ser @Emmanuel, utilizando la función incorporada LISTAGG (), disponible en Oracle 11g Release 2 y posterior.
como señaló @ user762952, y de acuerdo con la documentación de Oracle http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php , la función WM_CONCAT () también es una opción. Parece estable, pero Oracle recomienda explícitamente no usarlo para ninguna aplicación SQL, así que úselo bajo su propio riesgo.
Aparte de eso, tendrá que escribir su propia función; El documento de Oracle anterior tiene una guía sobre cómo hacerlo.
fuente
Para evitar valores nulos, puede usar CONCAT ()
fuente
Realmente me gustó la elegancia de la respuesta de Dana . Solo quería completarlo.
fuente
SELECT @names = @names + CASE WHEN LEN(@names)=0 THEN '' ELSE ', ' END + Name FROM Names
continuación, usted no tiene que truncar después.Esta respuesta requerirá algún privilegio en el servidor para funcionar.
Las asambleas son una buena opción para ti. Hay muchos sitios que explican cómo crearlo. El que yo creo que está muy bien explicado es este uno
Si lo desea, ya he creado el ensamblaje, y es posible descargar la DLL aquí .
Una vez que lo haya descargado, deberá ejecutar el siguiente script en su SQL Server:
Observe que la ruta al ensamblaje puede ser accesible para el servidor. Como ha realizado con éxito todos los pasos, puede usar la función como:
¡¡¡Espero eso ayude!!!
fuente
Ejemplo completo de MySQL:
Tenemos usuarios que pueden tener muchos datos y queremos tener una salida, donde podamos ver todos los datos de los usuarios en una lista:
Resultado:
Configuración de tabla:
Consulta:
fuente
Usualmente uso select como este para concatenar cadenas en SQL Server:
fuente
Si desea tratar con valores nulos, puede hacerlo agregando una cláusula where o agregando otra COALESCE alrededor de la primera.
fuente
Esto funcionó para mí ( SqlServer 2016 ):
Aquí está la fuente: https://www.mytecbits.com/
Y una solución para MySql (ya que esta página aparece en Google para MySql)
De documentaciones MySql
fuente
En Oracle, lo es
wm_concat
. Creo que esta función está disponible en la versión 10g y superior.fuente
Esto también puede ser útil
devoluciones
fuente