TSQL:如何将单列的行加入/组合成 CSV 列表

Posted

技术标签:

【中文标题】TSQL:如何将单列的行加入/组合成 CSV 列表【英文标题】:TSQL: How to Join / Combine rows of a single column into a CSV list 【发布时间】:2015-01-02 10:47:46 【问题描述】:

我有一个名为“colamer”的表,如下所示:

ID    Title   SectionID
1      abc     231
2      abc     232
3      pqr     95
4      jkl     165

我的存储过程:

CREATE PROCEDURE CheckDuplicateBannerforSection  
/*
      colamer_CheckDuplicateBannerforSection 'abc','231,232,233',NULL
*/

@BannerTitle NVARCHAR(200),        
@SectionId VARCHAR(50),        
@Result VARCHAR(100) OUT        
AS        
BEGIN        
 SET @Result = 1        
   BEGIN  
        IF EXISTS        
    (SELECT 1 FROM colamer WHERE Title= @BannerTitle   
 And SectionID in(SELECT value FROM dbo.colamer_fn_Split1( @SectionId ,',')))   
   END  
SELECT @Result  

结束

我想要输出: @结果 = 231,232

【问题讨论】:

函数dbo.colamer_fn_Split1有什么作用? 省去回复的麻烦,我想通了。 :) 它拆分字符串,,, @Pranav 在您的示例标题中,abc 只有一个 SectionID 231,那么您如何获取 231,231 作为输出。请澄清... 已编辑..检查..谢谢 【参考方案1】:

试试这个:

CREATE PROCEDURE CheckDuplicateBannerforSection  
/*
      Mercola_CheckDuplicateBannerforSection 'abc','231,232,233',NULL
*/

@BannerTitle NVARCHAR(200),        
@SectionId VARCHAR(50),        
@Result VARCHAR(100) OUT        
AS        
BEGIN  
   SELECT @Result = STUFF((SELECT ',' + CONVERT(VARCHAR(50), c.SectionID)
                           FROM colamer c
                           CROSS APPLY dbo.colamer_fn_Split1(@SectionId, ',') AS A 
                           WHERE c.SectionID = A.value AND Title = @BannerTitle   
                           FOR XML PATH('')
                          ), 1, 1, ''
                         )            
END  

【讨论】:

为什么使用CROSS APPLY?这不是必要的。原来的IN 列表很好,或者INNER JOIN 可以工作。 错误:将 varchar 值 ',' 转换为数据类型 int 时转换失败。 这会起作用,因为字符总是只有数字,但是如果你对文本数据使用这个xml path('') 方法,它可能会弄乱需要像& 这样的xml-entities 的字符。通过 stuff((select [...] for xml path(''), type).value('.', 'nvarchar(max)'), 1, 1, '') 解决这个问题(注意 , type.value('.', 'nvarchar(max)') @saharsh: ***.com/questions/27936466/…【参考方案2】:

我猜你正在寻找这样的东西:

CREATE PROCEDURE CheckDuplicateBannerforSection  

@BannerTitle NVARCHAR(200),        
@SectionId VARCHAR(50),        
@Result VARCHAR(100) OUT        
AS        
BEGIN        
  SET @Result = ''          
  Select @Result = @Result + ',' + Convert(nvarchar, SectionID)
  from colamer where Title = @BannerTitle and SectionID in(SELECT value FROM dbo.colamer_fn_Split1( @SectionId ,','))  
END 

【讨论】:

是的,这是多余的,请参阅固定版本。【参考方案3】:
CREATE PROCEDURE Mercola_CheckDuplicateBannerforSection  
/*
      Mercola_CheckDuplicateBannerforSection 'abc','231,232,233',NULL
*/

@BannerTitle NVARCHAR(200),        
@SectionId VARCHAR(50),        
@Result VARCHAR(100) OUT        
AS        
BEGIN        
 SET @Result = 1        
   BEGIN  
 IF EXISTS (SELECT 1 FROM colamer
             WHERE Title = @BannerTitle   
            And SectionID 
           in(SELECT value FROM 
             dbo.colamer_fn_Split1( @SectionId ,',')))   
BEGIN
    SELECT top 1 @Result=SectionID FROM colamer
    WHERE Title = @BannerTitle   
    And SectionID in(SELECT value FROM 
    dbo.colamer_fn_Split1( @SectionId ,','))
END
   END  
SELECT @Result  

END 

【讨论】:

输出应该是 231,232 ***.com/questions/27936466/…

以上是关于TSQL:如何将单列的行加入/组合成 CSV 列表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用熊猫将多行组合成具有多条件的行[关闭]

将 3 个列表组合成 1 个 LINQ 查询 C#

如何通过使用 R 将每个文件的数据添加为附加行来将不同的 .csv 文件组合成一个完整的文件?

如何编辑这个 mySQL 以便将相同 id 的行组合成 1 而不是 3?

将不同形状的 CSV 组合成一个 CSV

TSQL - 选择包含列表中所有项目的行