получить разделенные запятыми значения для сопоставления записи в SQL-запросе - PullRequest
0 голосов
/ 06 марта 2012

У меня есть таблица с именем SerialNos со следующими столбцами: Id, Parent_Id, SerialNo

Существуют разные SerialNo для Parent_Id, например:

Id     Parent_Id    SerialNo       
1          16          abc              
2          16          def             
3          23          hij              
4          23          klm    
5          23          nop      

Я просто хочу получить запятую, разделеннуюSerialNos.для конкретного Parent_Id, например, если Parent_Id передан 16, то O / p должно быть: 'abc, def', а если Parent_Id передано 23, то O / p должно быть: 'hij, klm, nop'

Ответы [ 4 ]

1 голос
/ 06 марта 2012

Ну, я мог бы посоветовать мой пост в блоге здесь , но, к сожалению, это не на английском языке :). Здесь - нечто подобное, просто без CLR.Там я знаю по крайней мере 4 решения:

  • Функция группировки CLR (ну, код на английском языке)
  • Можно использовать курсоры (не очень быстро)
  • Можно использовать что-то похожее на курсоры
  • Можно использовать XML

Итак, одно решение (не самое быстрое, но простое в написании):

Create Function fn_MyFunction
(
    @Parent_Id int
)
Returns NVarChar(1000)
As
Begin
    Declare @txt NVarChar(1000)

    SELECT @txt = COALESCE(@txt + ';' + SerialNo, SerialNo)
    FROM dbo.Table Where Parent_Id = @Parent_Id
    Return @txt
End 
1 голос
/ 06 марта 2012

для sql-server 2008 вы можете использовать следующий запрос (с вашим именем таблицы):

select distinct STUFF(ISNULL((SELECT ', ' + x.SerialNo
                FROM TableA x
               WHERE x.Parent_Id= t.Parent_Id
            GROUP BY x.SerialNo
             FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), ''), 1, 2, '')
from TableA t
where Parent_Id = 16
1 голос
/ 06 марта 2012

здесь хороший хак:

DECLARE @csv varchar(1000)
SELECT @csv = COALESCE(@csv+',','') + SerialNo
FROM SerialNos
WHERE Parent_Id = 23
SELECT @csv
1 голос
/ 06 марта 2012

В зависимости от сервера базы данных вы можете использовать group_concat.Например, если вы используете mysql group_concat с разделителем «,» даст вам результат, который вы после.http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

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

Извините, только что увидел, что ваш пост был помечен sql-server2008.Если в SQL Server 2008 отсутствует group_concat или что-то подобное, попробуйте эту ссылку http://blog.shlomoid.com/2008/11/emulating-mysqls-groupconcat-function.html

Извините, еще одно изменение, это поможет.http://groupconcat.codeplex.com/

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