【问题标题】:SQL, How to Concatenate results?SQL,如何连接结果?
【发布时间】:2010-11-23 07:28:47
【问题描述】:

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

问题详解:

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

EG

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

值 1

价值 2

价值 3

...

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

价值 1、价值 2、价值 3

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

编辑:

数据库是 MS TSQL (2005)

【问题讨论】:

  • 您是想只检索数据还是用它更新另一个字段?
  • 只是检索,也是它的 MS TSQL

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


【解决方案1】:

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

DECLARE @csv VARCHAR(1000)

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

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

【讨论】:

  • 注意到了,在这种情况下它是一个 varchar,但在其他情况下,这很可能是其他值类型。
  • 这很聪明,也很优雅。
【解决方案2】:

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

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

【讨论】:

  • 谢谢!我现在就试一试,如果有效,我会将您标记为已回答。
  • 这就是我一直在寻找的,工作得很好,非常感谢!
  • 选择 LEFT(@result,LEN(@result)-1) 作为文本
【解决方案3】:

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

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

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

【讨论】:

【解决方案4】:

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

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

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

马克

【讨论】:

  • 似乎很有趣,没有太多使用 XML 路径。我一定会玩这个。谢谢!
  • 怎么去掉最后的delimma,我的意思是最后还有个没用的,
【解决方案5】:

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

更多信息:

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

【讨论】:

  • 这其实很完美
【解决方案6】:

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

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

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

【讨论】:

    【解决方案7】:

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

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

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 2012-08-15
      • 2013-04-22
      • 2020-06-19
      • 1970-01-01
      相关资源
      最近更新 更多