Как я могу вывести список идентификаторов из таблицы SQL в виде строки значений, разделенных запятыми?
Мне нужно вывести список целых идентификаторов из таблицы, используя только записи, соответствующие некоторым критериям. Например:
Select ProdID From Products Where (ProdType='XYZ');
Уловка заключается в том, что я должен вернуть его как набор значений, разделенных запятыми, поэтому я могу использовать его для выбора элементов в списке с несколькими выборами:
111,231,554,112
а не как записи. Я не хочу делать это в своем коде на С# - мне бы хотелось, чтобы он вышел из базы данных с помощью запроса таким образом. Любые идеи?
Ответы
Ответ 1
В дополнение к методу @OMG Ponies вы также можете попробовать этот трюк COALESCE:
Использование COALESCE для создания строк с разделителями-запятыми
declare @string nvarchar(255)
select @string = coalesce(@string + ', ', '') + cast(prodid as nvarchar(5))
from products
Ответ 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, '')
Ответ 3
Для сервера SQL см. здесь: Объединить значения нескольких строк в один столбец
Ответ 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 будет содержать список ваших идентификаторов, хотя я не могу объяснить, почему это работает.