Как я могу вывести список идентификаторов из таблицы SQL в виде строки значений, разделенных запятыми?

Мне нужно вывести список целых идентификаторов из таблицы, используя только записи, соответствующие некоторым критериям. Например:

Select ProdID From Products Where (ProdType='XYZ');

Уловка заключается в том, что я должен вернуть его как набор значений, разделенных запятыми, поэтому я могу использовать его для выбора элементов в списке с несколькими выборами:

111,231,554,112

а не как записи. Я не хочу делать это в своем коде на С# - мне бы хотелось, чтобы он вышел из базы данных с помощью запроса таким образом. Любые идеи?

Ответы

Ответ 2

MySQL


SELECT GROUP_CONCAT(t.prodid SEPARATOR ',')
  FROM PRODUCTS t
 WHERE t.prodtype = 'XYZ'

Oracle:


Существует отличное резюме доступных методов агрегации строк на сайте Tim Hall.

SQL Server 2005 +


SELECT STUFF((SELECT ','+ t.prodid
                FROM PRODUCTS t
               WHERE t.prodtype = 'XYZ'
             FOR XML PATH('')), 1, 1, '')

Ответ 4

Это очень старый вопрос, но я добавляю ответ, который применяет уже принятый ответ, используя COALESCE Джастином Нисснером. Это приложение, как я обычно хотел бы применить этот метод, когда я запрашиваю родителя, и я хочу также иметь один столбец, который содержит список дочерних идентификаторов с разделителями-запятыми.

Эти примеры противоречат базе данных AdventureWorksLT, созданной в Azure SQL Database, если вы используете раскрывающийся список, чтобы выбрать ее при создании базы данных. Здесь ничего нового, просто удобное приложение, которое могло бы помочь кому-то.

Первый запрос заключается в том, как я обычно его использую:

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)

Ответ 5

Начиная с SQL Server 2017, теперь вы можете использовать функцию STRING_AGG.

Это позволяет вам создавать разделенный запятыми список из оператора SELECT (так хорошо работает с представлениями). Учитывая ваш пример, он станет:

SELECT STRING_AGG(ProdID, ',') FROM Products WHERE (ProdType='XYZ');

Ответ 6

Есть способ сделать это без дополнительных функций:

DECLARE @Test nvarchar(max) = ''

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

SELECT @Test

@Test будет содержать список ваших идентификаторов, хотя я не могу объяснить, почему это работает.