Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 用逗号或“AND”连接数据库表列的所有值_Sql_Sql Server - Fatal编程技术网

Sql 用逗号或“AND”连接数据库表列的所有值

Sql 用逗号或“AND”连接数据库表列的所有值,sql,sql-server,Sql,Sql Server,我对SQL Server Reporting Services SSSRS报告有以下要求:以一个字符串显示数据库表中某列的所有值,如下所示: 如果只有一个值,则显示它 如果有两个值,请用逗号连接它们 如果有两个以上的值,则将除最后两个值外的所有值用逗号连接,最后两个值用、和连接 值应该是不同的,即不允许有两个重复的值 为了举例说明,如果所讨论的列(我们称之为Column1)的值为: 专栏1 苹果 马铃薯 马铃薯 梨 葡萄 结果字符串应为: 苹果、土豆、梨和葡萄 所以我的问题是,如何在SQL语句中

我对SQL Server Reporting Services SSSRS报告有以下要求:以一个字符串显示数据库表中某列的所有值,如下所示:

如果只有一个值,则显示它

如果有两个值,请用逗号连接它们

如果有两个以上的值,则将除最后两个值外的所有值用逗号连接,最后两个值用、和连接

值应该是不同的,即不允许有两个重复的值

为了举例说明,如果所讨论的列(我们称之为Column1)的值为:

专栏1 苹果

马铃薯

马铃薯

葡萄

结果字符串应为:

苹果、土豆、梨和葡萄

所以我的问题是,如何在SQL语句中实现这一点?我可以用下面的SQL完成1、2和4,但3无法实现:

SELECT Stuff(
  (SELECT DISTINCT
        N', ' + Table1.Column1
   FROM
        Table2
                INNER JOIN Table ON Table1.Id = Table2.Table2ID_FK
   WHERE
    dbo.Table2.SomeId = 100
    FOR XML PATH(''),TYPE)
  .value('text()[1]','nvarchar(max)'),1,2,N'');

试试这样的

SELECT CASE
         WHEN Len(intr) - Len(Replace(intr, ',', '')) > 1 THEN Stuff(intr, ( Len(intr) - Charindex(',', Reverse(intr)) ) + 2, 0, ' and ')
         ELSE intr
       END
FROM   (SELECT Stuff((SELECT DISTINCT N', ' + Table1.Column1
                      FROM   Table2
                             INNER JOIN Table
                                     ON Table1.Id = Table2.Table2ID_FK
                      WHERE  dbo.Table2.SomeId = 100
                      FOR XML PATH(''), TYPE) .value('text()[1]', 'nvarchar(max)'), 1, 2, N'') AS intr)a 
我们可以使用子查询轻松地引用目标结果集,以查找列表中的最后一个值和值计数

使用大小写表达式在col=最后一个值时添加“and”,并使用子查询检查返回值的计数*:

雷克斯测试仪:

要使其适用于问题中的查询,请将公共表表达式中的查询替换为t,如


不要使用运行良好的代码。在该代码之外,修复该问题。以下是如何

暂时,为了清晰起见,我将使用文字。考虑一下:

    SELECT RIGHT('Apple, Potato, Pear, Grapes' , CHARINDEX (' ,' ,REVERSE('Apple, Potato, Pear, Grapes'))+1)
…产量:,葡萄

到目前为止还好吗?只需通过执行以下操作将其替换为和葡萄

    SELECT REPLACE('Apple, Potato, Pear, Grapes', RIGHT('Apple, Potato, Pear, Grapes' , CHARINDEX (' ,' ,REVERSE('Apple, Potato, Pear, Grapes'))+1), REPLACE(RIGHT('Apple, Potato, Pear, Grapes' , CHARINDEX (' ,' ,REVERSE('Apple, Potato, Pear, Grapes'))+1),',',' and'))
因此,为了使这些都是动态的,只需将文字“Apple、Potato、Pear、Grapes”替换为您应该分配给变量的原始查询结果

最后的代码如下所示:

    DECLARE @OrigValue AS NVARCHAR(MAX)

    SELECT @OrigValue = 
      Stuff(
      (SELECT DISTINCT
            N', ' + Table1.Column1
       FROM
            Table2
                    INNER JOIN Table ON Table1.Id = Table2.Table2ID_FK
       WHERE
        dbo.Table2.SomeId = 100
        FOR XML PATH(''),TYPE)
      .value('text()[1]','nvarchar(max)'),1,2,N'');

    SELECT REPLACE(@OrigValue, RIGHT(@OrigValue , CHARINDEX (' ,',REVERSE(@OrigValue))+1), REPLACE(RIGHT(@OrigValue, CHARINDEX (' ,',REVERSE(@OrigValue))+1),',',' and'))

我想你指的是梨和葡萄,而不是梨和葡萄。@GiorgosBetsos-事实上,逗号是完全有效的,在某些情况下,实际上可以导致更清楚的理解。它被称为串行逗号。这里有一个关于这个话题的精彩讨论@GiorgosBetsos,这叫a。Lynne Truss在她的风格指南《吃、射、叶》中写道:有些人喜欢牛津逗号,有些人不喜欢,我要说的是:喝了酒以后,千万不要在这些人之间插手。@SqlZim LOL。别开玩笑了。有些人对哪一个是正确的非常坚决不,我是说梨,葡萄。我相信这是正确的语法。这几乎是可行的,但它确实有效,即使列只有两个值。@Lukeff-现在检查此解决方案不是动态的,我怀疑它是否满足OP的需要。@JohnJoseph我不确定您为什么认为它不能满足OP的需要。如果用OP的查询替换公共表表达式t中的示例查询:从表1上的表2内部联接表1中选择DISTINCT col=Table1.Column1。Id=Table2.Table2ID\U FK,其中dbo.Table2.SomeId=100,它将与该结果集一起正常工作。啊。。。也许你应该编辑你的答案来指出这一点。这也很有效,实际上比@Prdp快一点点,尽管我用SQL Server的执行计划和客户端统计工具测量的速度和复杂性更复杂。如果可能的话,我会把两者都标为答案。更新:看起来只有一个答案,所以Prdp的答案是,因为它是第一个。这几乎有效,但并没有完全填满我列表中的2,即,如果只有两个值,它将它们连接起来,而不是逗号,。
    SELECT REPLACE('Apple, Potato, Pear, Grapes', RIGHT('Apple, Potato, Pear, Grapes' , CHARINDEX (' ,' ,REVERSE('Apple, Potato, Pear, Grapes'))+1), REPLACE(RIGHT('Apple, Potato, Pear, Grapes' , CHARINDEX (' ,' ,REVERSE('Apple, Potato, Pear, Grapes'))+1),',',' and'))
    DECLARE @OrigValue AS NVARCHAR(MAX)

    SELECT @OrigValue = 
      Stuff(
      (SELECT DISTINCT
            N', ' + Table1.Column1
       FROM
            Table2
                    INNER JOIN Table ON Table1.Id = Table2.Table2ID_FK
       WHERE
        dbo.Table2.SomeId = 100
        FOR XML PATH(''),TYPE)
      .value('text()[1]','nvarchar(max)'),1,2,N'');

    SELECT REPLACE(@OrigValue, RIGHT(@OrigValue , CHARINDEX (' ,',REVERSE(@OrigValue))+1), REPLACE(RIGHT(@OrigValue, CHARINDEX (' ,',REVERSE(@OrigValue))+1),',',' and'))