【问题标题】:how to select distinct and concatenate in sql如何在sql中选择不同和连接
【发布时间】:2010-01-17 15:40:47
【问题描述】:

假设我们在 SQLServer-2005 中有一个包含两列和以下数据行的下表:

Tiger    50
Wolf     4
Tiger    53
Lion     55
Elephant 54
Rhino    52
Lion     5

我们可以有一个 sql 查询,结果如下:Tiger,Wolf,Lion,Elephant,Rhino 作为单个字符串 varchar 输出吗?有可能吗? 使用 T-SQL 不可能单我使用 c# 中的结果作为 executescalar 的结果 提前谢谢你。

【问题讨论】:

    标签: sql sql-server-2005


    【解决方案1】:

    您可以使用for xml path 连接值:

    select distinct name + ', ' as [text()]
    from @t
    for xml path('')
    
    -->
    Elephant, Lion, Rhino, Tiger, Wolf, 
    

    如果您不喜欢尾随 ,'s,请删除最后 2 个字节。

    不知道为什么不能使用 T-SQL,你可以将它与 ExecuteScalar() 结合使用就可以了。

    样本数据:

    declare @t table (name varchar(max), id int)
    insert into @t 
    select 'Tiger', 50
    union all select 'Wolf', 4
    union all select 'Tiger', 53
    union all select 'Lion', 55
    union all select 'Elephant', 54
    union all select 'Rhino', 52
    union all select 'Lion', 5
    

    【讨论】:

    • @Andomar 我们可以在第一列中包含任何数据,因此无法对其进行硬编码。
    • @Thunder:第二部分只是您在 T-SQL 中的示例数据; for xml path 的查询应该适用于任何数据
    • @Andomar 我认为它是正确的,但我已经有数据表,我们可以将@t 链接到现有表吗?
    • @Thunder:是的,@t 只是我的表变量的名称(它不是真正的表,而是表变量,所以它以 @ 开头。)您可以将 @t 替换为你的桌子的名字
    • @Thunder:这是一种用于生成 XML 输出的构造。使用它来生成逗号分隔的列表是一种技巧。它不是为此而设计的。您可以在此处找到有关预期用途的更多信息:msdn.microsoft.com/en-us/library/ms190922.aspx
    【解决方案2】:

    【讨论】:

    • 无法使用 T-SQL 单我在 c# 中使用结果作为执行标量的结果
    • @Thunder,这没有任何意义,ExecuteScalar 的唯一要求是只有一个结果。在最终的SELECT 之前,SQL 的外观没有任何限制。我赞成这个。
    【解决方案3】:

    将 GROUP_CONCAT() 与 DISTINCT 一起使用:

    SELECT GROUP_CONCAT(DISTINCT colName) FROM tblName;
    

    【讨论】:

    • @Crozin 我认为您的答案接近解决方案但 GROUP_CONCAT 未被识别,请注意我们使用的是 sqlserver2005
    • Group_concat 在 MySQL 中工作,但问题是关于 SQL Server
    • 因为该示例使用了错误的 SQL 方言,所以不赞成投票。
    • 哦,我的错……我没有注意到它是关于 sql-server-2005 的。
    【解决方案4】:

    假设您是从 ExecuteScalar 获取它并在 C# 中使用生成的复合字符串,那么您最终将编写一个存储过程,或者只是让您的代码与数据表一起工作。

    您能否详细说明为什么不能使用存储过程?已经提供了一些很好的例子,你仍然可以得到你的标量结果

    【讨论】:

    • Sored 过程无法编写,因为它会增加部署中的更多进程,因为我们必须手动将 sproc 添加到 db 中
    【解决方案5】:

    最有效的方法可能是使用User-Defined Aggregate,但您也可以滥用UPDATE 声明:

    DECLARE @Result varchar(500)
    SET @Result = ''
    
    UPDATE Animals
        SET @Result = @Result + Name + ','
    
    SELECT @Result
    

    【讨论】:

      【解决方案6】:

      这就是 Andomar's Answer 的实施方式。感谢 Andomar 的回答,让我们学到了一些新东西。

      选择不同的summaryColumn + ', ' as [text()] from tablename for xml路径('')

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-11
        • 1970-01-01
        • 2011-01-05
        • 2012-10-02
        • 2017-02-20
        • 2016-11-13
        • 1970-01-01
        相关资源
        最近更新 更多