【问题标题】:retrive comma seperated values for matching record in sql query在 sql 查询中检索匹配记录的逗号分隔值
【发布时间】:2012-03-06 10:10:41
【问题描述】:

我有一个名为 SerialNos 的表,其中包含以下列: ID、Parent_Id、序列号

Parent_Id 上有不同的 SerialNo 喜欢:

Id     Parent_Id    SerialNo       
1          16          abc              
2          16          def             
3          23          hij              
4          23          klm    
5          23          nop      

我只想检索逗号分隔的序列号。对于特定的 Parent_Id 例如如果 Parent_Id 通过了 16,那么 O/p 应该是:'abc,def' 如果 Parent_Id 通过 23,那么 O/p 应该是:'hij,klm,nop'

【问题讨论】:

标签: sql-server-2008


【解决方案1】:

here 是一个不错的 hack:

DECLARE @csv varchar(1000)
SELECT @csv = COALESCE(@csv+',','') + SerialNo
FROM SerialNos
WHERE Parent_Id = 23
SELECT @csv

【讨论】:

  • 你添加的尾随逗号怎么样?
【解决方案2】:

根据数据库服务器,您可以使用 group_concat。例如,如果您使用带有“,”分隔符的 mysql group_concat,则会得到您想要的结果。 http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

如果您使用的是不同的数据库服务器,请查看其文档,很可能会有类似的内容。另请记住,某些数据库没有此功能。

抱歉,刚刚看到您的帖子被标记为 sql-server2008。如果 sql server 2008 没有 group_concat 或类似的东西,试试这个链接 http://blog.shlomoid.com/2008/11/emulating-mysqls-groupconcat-function.html

抱歉,再次编辑,这将有所帮助。 http://groupconcat.codeplex.com/

【讨论】:

  • -1 用于回答之前被问过多次的问题
  • 对不起,我一直认为提问者有责任在提问前检查stackoverflow!
  • +1,因为这个答案不符合不值得投票的标准。 “每当你遇到一个非常草率、不费吹灰之力的帖子,或者一个明显不正确且可能危险地不正确的答案时,请使用你的反对票。”
【解决方案3】:

对于 sql-server 2008,您可以使用以下查询(使用您的表名):

select distinct STUFF(ISNULL((SELECT ', ' + x.SerialNo
                FROM TableA x
               WHERE x.Parent_Id= t.Parent_Id
            GROUP BY x.SerialNo
             FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), ''), 1, 2, '')
from TableA t
where Parent_Id = 16

【讨论】:

    【解决方案4】:

    我可以建议我的博客帖子here,但不幸的是它不是英文的:)。 Here 是类似的东西,只是没有 CLR。 我知道至少有 4 个解决方案:

    • CLR 分组功能(嗯,code 是英文的)
    • 可以使用游标(不是很快)
    • 可以使用类似于光标的东西
    • 可以使用 XML

    所以一个解决方案(不是最快的,但容易写):

    Create Function fn_MyFunction
    (
        @Parent_Id int
    )
    Returns NVarChar(1000)
    As
    Begin
        Declare @txt NVarChar(1000)
          
        SELECT @txt = COALESCE(@txt + ';' + SerialNo, SerialNo)
        FROM dbo.Table Where Parent_Id = @Parent_Id
        Return @txt
    End 
    

    【讨论】:

      猜你喜欢
      • 2012-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多