41

我目前有一个返回多个字段的 SQL 查询。我需要一个字段才能有效地成为子查询子。

详细问题:

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

EG结果返回自

 (SELECT ModuleValue FROM Table_X WHERE ModuleID=@ModuleID)

值 1

价值 2

价值 3

...

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

价值 1、价值 2、价值 3

是否有一个简单的串联方法可以成为用户?

编辑:

DB 是 MS TSQL (2005)

4

7 回答 7

38

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

DECLARE @csv VARCHAR(1000)

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

(如果该ModuleValue列还不是字符串类型,那么您可能需要将其转换为VARCHAR.)

于 2009-08-27T09:18:10.013 回答
36

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

declare @result varchar(500)
set @result = ''
select @result = @result + ModuleValue + ', ' 
from TableX where ModuleId = @ModuleId
于 2009-08-27T09:01:11.060 回答
17

在 mysql 中,您将使用以下函数:

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

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

于 2009-08-27T09:01:32.603 回答
12

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

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

这应该会给你一些你正在寻找的东西。

马克

于 2009-08-27T09:05:21.473 回答
8

在我看来,如果您使用的是 SQL Server 2017 或更高版本,使用STRING_AGG( ... )是最好的解决方案:

更多信息:

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

于 2017-09-08T17:04:08.823 回答
6

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

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

不过,Group-concat 并非在所有数据库服务器上都可用。

于 2009-08-27T09:02:48.920 回答
4

Marc 的小更新,我们将在末尾添加额外的“,”。我使用了 stuff 函数来删除多余的分号。

       SELECT STUFF((  SELECT ',' + ModuleValue AS ModuleValue
                           FROM ModuleValue WHERE ModuleID=@ModuleID
                      FOR XML PATH('') 
                     ), 1, 1, '' )
于 2016-04-26T10:12:31.540 回答