SQL,如何连接结果?

时间:2009-08-27 08:57:13

标签: sql sql-server sql-server-2005 concatenation sql-server-group-concat

我目前有一个返回许多字段的SQL查询。我需要一个字段实际上是一个子查询子。

详细问题:

  

如果我有一个包含两列的表X,ModuleID并说ModuleValue,我如何编写SQL查询来获取结果并将其连接到一个字段中:

EG

返回的结果
 (SELECT ModuleValue FROM Table_X WHERE ModuleID=@ModuleID)

价值1

价值2

价值3

...

我需要返回结果(作为单行,与上面不同):

  

值1,值2,值3

是否有一个简单的连接方法可以是用户?

修改

  

DB是MS TSQL(2005)

7 个答案:

答案 0 :(得分:35)

与大多数其他答案不同,这个会自动排除尾随逗号。

DECLARE @csv VARCHAR(1000)

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

(如果ModuleValue列不是字符串类型,则可能需要将其强制转换为VARCHAR。)

答案 1 :(得分:30)

使用MSSQL,您可以执行以下操作:

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

答案 2 :(得分:11)

在mysql中你可以使用以下函数:

SELECT GROUP_CONCAT(ModuleValue, ",") FROM Table_X WHERE ModuleID=@ModuleID

我不确定你使用的是哪种方言。

答案 3 :(得分:9)

在SQL Server 2005及更高版本中,您可以执行以下操作:

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

这应该会给你一些你想要的东西。

马克

答案 4 :(得分:3)

这取决于您使用的数据库。例如,MySQL支持(非标准)group_concat函数。所以你可以写:

SELECT GROUP_CONCAT(ModuleValue) FROM Table_X WHERE ModuleID=@ModuleID

但是,所有数据库服务器都无法使用Group-concat。

答案 5 :(得分:3)

在我看来,使用STRING_AGG( ... )是最佳解决方案:

更多信息:

  

https://stackoverflow.com/a/42778050/1260488

答案 6 :(得分:2)

Marc的小更新我们最后会有额外的“,”。我使用stuff函数来删除额外的分号。

       SELECT STUFF((  SELECT ',' + ModuleValue AS ModuleValue
                           FROM ModuleValue WHERE ModuleID=@ModuleID
                      FOR XML PATH('') 
                     ), 1, 1, '' )