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

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

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

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

111,231,554,112

, а не как записи. Я не хочу делать это в своем C # -коде - я бы хотел, чтобы он выводился прямо из базы данных через запрос таким образом. Есть идеи?

Ответы [ 6 ]

17 голосов
/ 21 января 2010

В дополнение к методу @OMG Ponies, вы также можете попробовать этот трюк COALESCE из:

Использование COALESCE для создания разделенных запятыми строк

declare @string nvarchar(255)

select @string = coalesce(@string + ', ', '') + cast(prodid as nvarchar(5))
from products
17 голосов
/ 21 января 2010

MySQL


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

Oracle:


На сайте Тима Холла есть отличная сводка доступных методов агрегирования строк .

SQL Server 2005 +


SELECT STUFF((SELECT ','+ t.prodid
                FROM PRODUCTS t
               WHERE t.prodtype = 'XYZ'
             FOR XML PATH('')), 1, 1, '')
1 голос
/ 26 марта 2019

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

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

SELECT STRING_AGG(ProdID, ',') FROM Products WHERE (ProdType='XYZ');
1 голос
/ 17 января 2018

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

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

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

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)
1 голос
/ 21 января 2010
0 голосов
/ 17 июня 2019

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

DECLARE @Test nvarchar(max) = ''

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

SELECT @Test

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...