如何从SQL表中提取以逗号分隔的值字符串形式的ID列表?

如何从SQL表中提取以逗号分隔的值字符串形式的ID列表?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我必须仅使用符合某些条件的记录从表中提取整数ID列表。例如: Select ProdID From Products Where (ProdType='XYZ'); 问题是,我必须将其作为一组逗号分隔的值返回,以便使用它在多选列表中选择项目: 111,231,554,112 而不是作为记录。我不想在我的C代码中这样做——我希望它通过这种方式直接从数据库中查询出来。有什么想法吗?有关SQL server,请参见此处:MySQL 神谕: 蒂姆·霍尔的网站上有一篇关于这个问题的精彩摘要 SQL S

我必须仅使用符合某些条件的记录从表中提取整数ID列表。例如:

Select ProdID From Products Where (ProdType='XYZ');
问题是,我必须将其作为一组逗号分隔的值返回,以便使用它在多选列表中选择项目:

111,231,554,112
而不是作为记录。我不想在我的C代码中这样做——我希望它通过这种方式直接从数据库中查询出来。有什么想法吗?

有关SQL server,请参见此处:

MySQL 神谕: 蒂姆·霍尔的网站上有一篇关于这个问题的精彩摘要

SQL Server 2005+
除了@OMG Ponies方法外,您还可以尝试以下合并技巧:


这是一个非常古老的问题,但我添加了一个答案,该答案应用了Justin Niessner使用COALESCE已经接受的答案。这个应用程序就是我通常希望应用这种技术的方式,在这里我查询一个父项,并且我还希望有一个包含逗号分隔的子ID列表的列

这些示例与在Azure SQL数据库中创建的AdventureWorksLT数据库不符,如果您在设置数据库时使用下拉列表选择它。这里没有什么新东西,只是一个方便的应用程序,可以帮助别人

第一个问题是我通常如何使用它:

SELECT
    SalesLT.ProductCategory.*,
    STUFF((SELECT ','+ cast(ProductID as nvarchar(10)) FROM SalesLT.Product WHERE ProductCategoryID=SalesLT.ProductCategory.ProductCategoryID ORDER BY ProductID FOR XML PATH('')), 1, 1, '') AS ProductIDs
FROM SalesLT.ProductCategory
第二个查询显示了它的自引用用法:

SELECT
    ParentCategory.*,
    STUFF((SELECT ','+ cast(child.ProductCategoryID as nvarchar(10)) FROM SalesLT.ProductCategory child WHERE child.ParentProductCategoryID=ParentCategory.ProductCategoryID ORDER BY child.ProductCategoryID FOR XML PATH('')), 1, 1, '') AS ChildCategoryIDs
FROM SalesLT.ProductCategory ParentCategory
WHERE
    EXISTS (SELECT ParentProductCategoryID FROM SalesLT.ProductCategory children WHERE children.ParentProductCategoryID=ParentCategory.ProductCategoryID)

从SQL Server 2017开始,您现在可以使用该函数

这允许您在SELECT语句中创建逗号分隔的列表,这样可以很好地处理视图。根据您的示例,它将成为:

从ProdType='XYZ'所在的产品中选择字符串_AGGProdID',';
有一种方法可以在不使用其他功能的情况下完成此操作:

DECLARE @Test nvarchar(max) = ''

SELECT @Test = @Test + ProdID + ', '
FROM Products 
WHERE (ProdType='XYZ')

SELECT @Test

@测试将包含您的ID列表,尽管我无法解释为什么这样做。

糟糕,答案很好。向上投票。我不知道怎么做。酷。@OMG Ponies-对于SQLServer,您知道使用coalese:select@ids=coalesce@ids“+”,“,+convertvarchar,ids中的id将比您的方法慢很多?回答我自己的问题,Rob Farley有一篇文章提到了@David Hall:使用合并需要首先声明变量,而STUFF没有。如果可以的话,明天性能会比较吗?+1-我应该提到这是SQL Server 2008-抱歉!小马-我想看看这个比较!我给了Justin答案,因为这是第一个使用Coalesce的答案,我将在一个存储过程中这样做。不过,我还是希望看到你的分析结果。读得好:@OMG Ponies-谢谢你的阅读。很高兴知道有一种更可靠的方法来制作sting.Neat。我只需要从另一个方向做这件事,有人认为在数据库中存储逗号分隔的值列表是个好主意。我想知道在SQL中这样做是否有什么特别的好处,而不是在客户端上进行数组操作?我使用的是SQL server,只有在最后添加以下语句时才起作用:select@string as CommaSeparatedI我尝试了这个没有函数的版本,但遇到了两个问题:1。因为我的ProdID是Int,所以我不得不在它上面添加一个cast。我总是在@测试结束时得到一个需要删除的尾随“,”
SELECT
    SalesLT.ProductCategory.*,
    STUFF((SELECT ','+ cast(ProductID as nvarchar(10)) FROM SalesLT.Product WHERE ProductCategoryID=SalesLT.ProductCategory.ProductCategoryID ORDER BY ProductID FOR XML PATH('')), 1, 1, '') AS ProductIDs
FROM SalesLT.ProductCategory
SELECT
    ParentCategory.*,
    STUFF((SELECT ','+ cast(child.ProductCategoryID as nvarchar(10)) FROM SalesLT.ProductCategory child WHERE child.ParentProductCategoryID=ParentCategory.ProductCategoryID ORDER BY child.ProductCategoryID FOR XML PATH('')), 1, 1, '') AS ChildCategoryIDs
FROM SalesLT.ProductCategory ParentCategory
WHERE
    EXISTS (SELECT ParentProductCategoryID FROM SalesLT.ProductCategory children WHERE children.ParentProductCategoryID=ParentCategory.ProductCategoryID)
DECLARE @Test nvarchar(max) = ''

SELECT @Test = @Test + ProdID + ', '
FROM Products 
WHERE (ProdType='XYZ')

SELECT @Test