在sql查询中检索匹配记录的逗号分隔值

时间:2012-03-06 10:10:41

标签: sql-server-2008

我有一个名为SerialNos的表,其中包含以下列: Id,Parent_Id,SerialNo

Parent_Id上有不同的SerialNo 喜欢:

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

我只想检索逗号分隔的SerialNos。特别是Parent_Id 例如如果Parent_Id传递16,则O / p应为:'abc,def' 如果Parent_Id传递23,则O / p应为:'hij,klm,nop'

4 个答案:

答案 0 :(得分:1)

根据数据库服务器,您可以使用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 :(得分:1)

对于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

答案 2 :(得分:1)

here是一个不错的黑客:

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

答案 3 :(得分:1)

我可以建议我的博客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