【问题标题】:Concatenating multiple rows fields into one column in T-SQL在 T-SQL 中将多行字段连接成一列
【发布时间】:2011-06-11 23:45:55
【问题描述】:

我正在编写一个 SQL 查询,其中我需要对一个表执行子选择,这通常会返回多行。我需要能够将所有行中某个字段的结果连接到一个字段中以输出。这可能吗?如何实现?

例如,如果 SQL 查询返回

id | field
1  | test1
2  | test2
3  | test3

我需要输出字段为“test1 test2 test3”。 谢谢

【问题讨论】:

标签: asp.net sql tsql


【解决方案1】:

这是for xml 的技巧:

    SELECT  field + ' ' as [text()]
    FROM    YourTable
    FOR XML PATH ('')

打印出来:

test1 test2 test3

它通常与outer apply 一起使用,为每一行执行一次。

【讨论】:

    【解决方案2】:
    declare @sample table(id int, field varchar(20))
    insert into @sample values(1,'test1')
    insert into @sample values(2,'test2')
    insert into @sample values(3,'test3')
    declare @result varchar(max) set @result = ''
    select @result = @result + ' '+field from @sample
    select @result
    

    SQLCLR 自定义聚合器将是一种替代(阅读更好)解决方案

    【讨论】:

      【解决方案3】:

      试试这个:

      SELECT RTRIM(field)
        FROM (
                      SELECT field + ' ' field
                          FROM <YOUR_TABLE>
                          FOR XML PATH('')
                   ) a
      

      【讨论】:

      • 在我的机器上,这给出:No column name was specified for column 1 of 'a'.
      • 更新了帖子以反映指定的列名。
      • 您必须将) a 更改为) a(field);然后它将打印&lt;field1&gt;field1 &lt;/field1&gt;&lt;field1&gt;field2 &lt;/field1&gt;&lt;field1&gt;field3 &lt;/field1&gt;,您可以通过将SELECT field + ' ' field更改为SELECT field + ' ' as [text()]来修复它
      【解决方案4】:

      作为现有答案的补充。尝试将 COALESCE 表达式与您要使用的列名一起包含在内。这样可以避免在您的连接字符串中有空值,并避免您的列表看起来像这样。注意多余的空格。

      field1 field2   field4 field
      

      更多详情请见here

      GO
      
      DECLARE @tableName VARCHAR(MAX)
      SELECT  @tableName = COALESCE(@tableName + ' ' ,'') + Name
      FROM    sys.tables
      SELECT  @tableName
      
      GO
      

      【讨论】:

        【解决方案5】:

        可以用光标来做。

        declare @field nvarchar(max)
        declare @concat nvarchar(max)
        set @concat = ''
        declare @cursor cursor
        set @cursor = cursor for select field from table
        open @cursor
        fetch next from @cursor into @field
        while @@fetch_status = 0
        begin
          set @concat = concat(@concat,@field)
          fetch next from @cursor into @field
        end
        

        您的练习是在连接的字符串之间添加空格:-)

        猜你喜欢
        • 2012-01-01
        • 2020-11-03
        • 1970-01-01
        • 2017-12-01
        • 2020-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多