Каков наилучший способ свернуть строки SELECT в строку? - PullRequest
6 голосов
/ 05 мая 2009

В операторе (или процедуре) SQL я хочу свернуть строки этой таблицы в одну строку с разделителями-запятыми.

simpleTable

id  value
--  ----- 
1    "a"
2    "b"
3    "c"

Свернуть до:

"a, b, c"

Ответы [ 4 ]

6 голосов
/ 05 мая 2009

Вы можете объединить, используя встроенный оператор 'set' в запросе:

declare @combined varchar(2000)
select @combined = isnull(@combined + ', ','') + isnull(value,'')
from simpleTable

print @combined

(Обратите внимание, что первый isnull () инициализирует строку, а второй isnull () особенно важен, если в столбце «значение» есть вероятность появления нулевых значений, поскольку в противном случае один ноль может уничтожить всю конкатенацию)

(отредактированный код и пояснения после комментариев)

Редактировать (десять лет спустя):

SQL Server 2017 представил функцию STRING_AGG () , которая обеспечивает официальный способ объединения строк из разных строк. Как и другие функции агрегирования, такие как COUNT (), его можно использовать с GROUP BY.

Таким образом, для приведенного выше примера вы можете сделать:

select string_agg(value, ', ')
from simpleTable

Если у вас есть какой-то другой столбец и вы хотите объединить значения этого столбца, вы бы добавили предложение group by, например:

select someCategory, string_agg(value, ', ') as concatValues
from simpleTable
group by someCategory

Примечание. String_agg будет работать только с SQL 2017 и выше.

5 голосов
/ 05 мая 2009

Это будет работать только в MSSQL 2005 +

select value + ',' from simpletable for xml path ('')

.. один из способов избежать лишней запятой:

select case(row_number() over (order by id))
when 1 then value else ',' + value end
from simpletable
for xml path ('')
2 голосов
/ 05 мая 2009
DECLARE @EmployeeList varchar(100)

SELECT @EmployeeList = COALESCE(@EmployeeList + ', ', '') + 
   CAST(Emp_UniqueID AS varchar(5))
FROM SalesCallsEmployees
WHERE SalCal_UniqueID = 1

SELECT @EmployeeList

Результаты:

1, 2, 4
0 голосов
/ 06 мая 2009

Это основано на ответе @codeulike, но предотвратит потерю части строки, которая будет конкатенирована до того, как будет конкатенировано нулевое «значение».

declare @combined varchar(2000)
select @combined = isnull(@combined + ', ','') + ISNULL(value,'')
from simpleTable

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