SQL, как объединить результаты? - PullRequest
30 голосов
/ 27 августа 2009

В настоящее время у меня есть запрос SQL, который возвращает количество полей. Мне нужно, чтобы один из полей был фактически подзапросом к югу.

Проблема в деталях:

Если у меня есть таблица X с двумя столбцами, ModuleID и скажем ModuleValue, как мне написать SQL-запрос, чтобы взять результаты и объединить его в одно поле:

EG Результаты возвращены с

 (SELECT ModuleValue FROM Table_X WHERE ModuleID=@ModuleID)

Значение 1

Значение 2

Значение 3

...

Мне нужно вернуть результат таким образом (в виде одной строки, в отличие от вышеупомянутого):

Значение 1, Значение 2, Значение 3

Есть ли простой метод конкатенации, который может быть пользователем?

EDIT:

БД - MS TSQL (2005)

Ответы [ 7 ]

35 голосов
/ 27 августа 2009

Это автоматически исключает запятую, в отличие от большинства других ответов.

DECLARE @csv VARCHAR(1000)

SELECT @csv = COALESCE(@csv + ',', '') + ModuleValue
FROM Table_X
WHERE ModuleID = @ModuleID

(Если столбец ModuleValue уже не является строковым типом, вам может потребоваться преобразовать его в VARCHAR.)

31 голосов
/ 27 августа 2009

С MSSQL вы можете сделать что-то вроде этого:

declare @result varchar(500)
set @result = ''
select @result = @result + ModuleValue + ', ' 
from TableX where ModuleId = @ModuleId
11 голосов
/ 27 августа 2009

В MySQL вы будете использовать следующую функцию:

SELECT GROUP_CONCAT(ModuleValue, ",") FROM Table_X WHERE ModuleID=@ModuleID

Я не уверен, какой диалект вы используете.

9 голосов
/ 27 августа 2009

В SQL Server 2005 и более поздних версиях вы можете сделать что-то вроде этого:

SELECT 
    (SELECT ModuleValue + ','
     FROM dbo.Modules
     FOR XML PATH('')
    ) 
FROM dbo.Modules
WHERE ModuleID = 1

Это должно дать вам что-то вроде того, что вы ищете.

Марк

3 голосов
/ 08 сентября 2017

На мой взгляд, использование STRING_AGG( ... ) является лучшим решением:

Больше на:

https://stackoverflow.com/a/42778050/1260488

3 голосов
/ 27 августа 2009

Это зависит от базы данных, которую вы используете. Например, MySQL поддерживает (нестандартную) функцию group_concat . Чтобы вы могли написать:

SELECT GROUP_CONCAT(ModuleValue) FROM Table_X WHERE ModuleID=@ModuleID

Групповое объединение доступно не на всех серверах баз данных.

2 голосов
/ 26 апреля 2016

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

       SELECT STUFF((  SELECT ',' + ModuleValue AS ModuleValue
                           FROM ModuleValue WHERE ModuleID=@ModuleID
                      FOR XML PATH('') 
                     ), 1, 1, '' )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...