23

Actualmente tengo una consulta SQL que devuelve un número de campos. Necesito uno de los campos para ser efectivamente un sub sub consulta que.SQL, Cómo concatenar resultados?

el problema en detalle:

Si tengo una tabla X con dos columnas, ModuleID y decir ModuleValue, ¿cómo puedo escribir una consulta SQL para tomar los resultados y concatenar en un campo:

EG resultados devueltos desde

(SELECT ModuleValue FROM Table_X WHERE [email protected]) 

Valor 1

Valor 2

Valor 3

...

necesito devolver el resultado de este modo (como una sola fila, a diferencia de los anteriores):

Valor 1, valor 2, valor 3

¿Hay un método simple de concatenación que podría ser usuario?

EDIT:

DB es MS TSQL (2005)

+0

¿Usted está queriendo simplemente recuperar los datos o actualizar otro campo con ¿eso? – Evernoob

+0

Solo Recuperando, También su MS TSQL – Darknight

Respuesta

26

Con MSSQL se puede hacer algo como esto:

declare @result varchar(500) 
set @result = '' 
select @result = @result + ModuleValue + ', ' 
from TableX where ModuleId = @ModuleId 
+0

¡Gracias! Voy a probar esto ahora, te marcaré como respondido si funciona. – Darknight

+0

Esto es lo que estaba buscando funcionó bien, ¡muchas gracias! – Darknight

+1

SELECCIONAR IZQUIERDA (@ resultado, LEN (@result) -1) AS Txt – suiwenfeng

10

en MySQL tendrá que utilizar la función siguiente:

SELECT GROUP_CONCAT(ModuleValue, ",") FROM Table_X WHERE [email protected] 

No estoy seguro de qué dialecto estás usando.

+0

Relacionado porque me fue útil: http://stackoverflow.com/questions/2567000/mysql-and-group-concat-maximum-length – starryknight64

3

Depende de la base de datos que esté utilizando. MySQL, por ejemplo, admite la función (no estándar) group_concat. Para que pueda escribir:

SELECT GROUP_CONCAT(ModuleValue) FROM Table_X WHERE [email protected] 

Group-concat no está disponible en todos los servidores de bases de datos.

6

En SQL Server 2005 y arriba, podría hacer algo como esto:

SELECT 
    (SELECT ModuleValue + ',' 
    FROM dbo.Modules 
    FOR XML PATH('') 
    ) 
FROM dbo.Modules 
WHERE ModuleID = 1 

Esto debería dar algo así como lo que estás buscando.

Marc

+0

parece interesante, no ha usado XML mucho. Jugaré seguro con este. ¡Gracias! – Darknight

31

Éste excluye automáticamente la coma final, a diferencia de la mayoría de las otras respuestas.

DECLARE @csv VARCHAR(1000) 

SELECT @csv = COALESCE(@csv + ',', '') + ModuleValue 
FROM Table_X 
WHERE ModuleID = @ModuleID 

(Si la columna de la ModuleValue no es ya un tipo de cadena a continuación, puede que tenga que convertirlo a VARCHAR.)

+0

Bien notado, en este caso era un varchar, pero en otros casos este coule bien podría ser de otros tipos de valores. – Darknight

0

Pequeña actualización sobre Marc tendremos adicional "" en el fin. utilicé la función de cosas para eliminar el punto y coma adicional.

 SELECT STUFF(( SELECT ',' + ModuleValue AS ModuleValue 
          FROM ModuleValue WHERE [email protected] 
         FOR XML PATH('') 
        ), 1, 1, '')