代码之家  ›  专栏  ›  技术社区  ›  Darknight

SQL,如何连接结果?

  •  30
  • Darknight  · 技术社区  · 16 年前

    我目前有一个SQL查询,它返回许多字段。我需要一个字段来有效地作为子查询子字段。

    具体问题如下:

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

    从返回的结果

     (SELECT ModuleValue FROM Table_X WHERE ModuleID=@ModuleID)
    

    价值2

    价值3

    ...

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

    值1、值2、值3

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

    编辑:

    DB是MS TSQL(2005年)

    7 回复  |  直到 14 年前
        1
  •  37
  •   LukeH    16 年前

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

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

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

        2
  •  36
  •   Blorgbeard    16 年前

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

    declare @result varchar(500)
    set @result = ''
    select @result = @result + ModuleValue + ', ' 
    from TableX where ModuleId = @ModuleId
    
        3
  •  17
  •   Silvan Mühlemann    16 年前

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

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

    我不知道你用的是哪种方言。

        4
  •  10
  •   marc_s    16 年前

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

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

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

        5
  •  8
  •   Jon R    5 年前

    在我看来,如果您使用的是SQL Server 2017或更高版本,请使用 STRING_AGG( ... )

    更多信息,请访问:

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

        6
  •  6
  •   idrosid    16 年前

    这取决于您使用的数据库。例如,MySQL支持(非标准) group_concat

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

    但是,并非所有数据库服务器上都有组concat。

        7
  •  3
  •   sandeep rawat    9 年前

    关于Marc的小更新,我们将在最后增加“,”。我使用了stuff函数来删除额外的分号。

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