【问题标题】:Combining numerous strings into one row [duplicate]将多个字符串组合成一行[重复]
【发布时间】:2019-03-22 02:05:48
【问题描述】:

我遇到了以下问题。

我的示例数据如下所示:

03D 03F 03G 03H 03I 04E 05D 05G 05H 06C 08D 08D (BEST) 08E 08E (BEST) 08F 08F (BEST) 08G 08G (BEST) 08H 08H (BEST) 08I 08I (BEST) 08J 08K 08k08K 08L 08L (BEST)

我需要将这些数据组合成一个字符串,如下所示:

03D;03F;03G;03H;03I;04E;05D;05G;05H;06C;08D;08D (BEST);08E;08E (BEST);08F;08F (BEST);08G;08G (BEST);08H;08H (BEST);08I;08I (BEST);08J;08K;08k08K;08L;08L (BEST);

请注意,此表中始终会添加数据,因此,我需要此表准确运行,以使用此表的结果更新单个字段。

不同的值应该用这个操作符;分割

我尝试实现的脚本是:

declare @loop   int
,       @Tempid int
,       @lookup varchar(max)

    declare @bin table
    (id  int identity primary key, bin varchar(100))

    insert into @bin (bin)
    select distinct
    cBinLocationName
    from    _btblBinLocation

    set @lookup =   ''
                begin
                    select @Loop = min(ID) FROM @bin
                    while @Loop IS NOT NULL
                        begin
                        set @Tempid =   (select id from @bin where id=@Loop)
                            set @lookup =   @lookup + (select bin FROM @bin where ID=@Tempid)+';'
                            select @Loop = min(ID) FROM @bin where ID>@Loop
                        end
                end
    select  @lookup

问题是,我的结果一直是''

请帮忙?

【问题讨论】:

  • 我不这么认为,因为数据提取会超出 SQL 表
  • 如果不是 SQL 表,您的数据来自哪里..?
  • 它来自一个 SQL 表,因此我的代码是 select distinct cBinLocationName from _btblBinLocation
  • 不要因为在重复的 @Larnu 链接中使用 FOR XML 指令而被推迟,它从数据库表中检索数据并使用分隔符连接它
  • 感谢 Larnu,是的,您的帮助很有帮助。并且感谢迪亚多,我从来没有在这方面使用过 XML,我不明白它是如何工作的,但我设法让它工作,我现在将分享答案。

标签: sql-server tsql


【解决方案1】:

我通过导航到 Larnu 在 cmets 中发布的链接解决了这个问题。

我改变了那里的答案以适合我,下面是脚本:

select top 1  stuff((select distinct cBinLocationName + ';'
            from _btblBINLocation
        for xml path('')), 1, 1, '') as lookup
from _btblBINLocation

这正是我想要的。有了这些结果,我将能够基于此更新一个字段。

谢谢大家。

结果如下所示:

【讨论】:

  • 这里不需要TOP 1或第二名。
【解决方案2】:

这是一个不需要 XML 和 STUFF 的简单示例:

DECLARE @TestData TABLE
    (
        [TestData] NVARCHAR(200)
    );

DECLARE @Del CHAR(1) = ';';
DECLARE @Lookup NVARCHAR(MAX) = '';

INSERT INTO @TestData (
                          [TestData]
                      )
VALUES ( '03D' )
     , ( '03F' )
     , ( '03G' )
     , ( '03H' )
     , ( '03I' )
     , ( '04E' )
     , ( '05D' )
     , ( '05G' )
     , ( '05H' )
     , ( '06C' )
     , ( '08D' )
     , ( '08D (BEST)' )
     , ( '08E' )
     , ( '08E (BEST)' )
     , ( '08F' )
     , ( '08F (BEST)' )
     , ( '08G' )
     , ( '08G (BEST)' )
     , ( '08H' )
     , ( '08H (BEST)' )
     , ( '08I' )
     , ( '08I (BEST)' )
     , ( '08J' )
     , ( '08K' )
     , ( '08k08K' )
     , ( '08L' )
     , ( '08L (BEST)' );

--puts the result set into @Lookup
SELECT @Lookup = @Lookup + [TestData] + @Del
FROM   @TestData;

--Remove the trailing delimiter
SET @Lookup = SUBSTRING(@Lookup, 1, LEN(@Lookup) - 1);

SELECT @Lookup;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 2013-12-25
    • 2018-11-14
    • 2022-01-13
    • 2011-08-01
    • 1970-01-01
    相关资源
    最近更新 更多