2011-12-15 2 views
1

Я хотел бы указать имя человека и все его адреса электронной почты как список, разделенный запятой. Я знаю, что это имеет какое-то отношение к COALESCE, но я не знаю, как это сделать. Вот что у меня есть до сих пор:список разделенных запятой

select PersonName,EmailAddresses 
from dbo.Person 
JOIN (
    SELECT PersonID,COALESCE(EmailAddress,', ','') AS EmailAddresses 
    FROM dbo.Email 
) Email 
ON Email.PersonID = Person.PersonID 

Прямо сейчас, COALESCE возвращает только 1 адрес электронной почты на человека.
Интересно, нужно ли мне написать функцию.

+2

возможно дубликат [ВОССТАНОВЛЕНИЕ SQL отношений как разделенный запятыми строки] (http://stackoverflow.com/questions/3875979/retrieving-sql-relationships-as-a -comma-delimited-string) –

ответ

4

Попробуйте это:

select PersonName, 

(
SELECT 
    EmailAddress + ',' 
FROM 
    dbo.Email 
WHERE 
    Email.PersonID = Person.PersonID 
ORDER BY 
EmailAddress 
FOR XML PATH ('') 
) as emailAddresses 

from dbo.Person 

Ключ FOR XML PATH ('') - это группы значения вместе, как одну строку.

+0

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

+0

Не только это исправить, но я пошел вниз по коридору, показывая всем моим коллегам, как это здорово! –

+0

Да, это опрятный трюк. Я был очень доволен, когда узнал об этом. –

1

Не могли бы вы попробовать это:

DECLARE @EmailAddress VARCHAR(4000) 

SELECT @EmailAddress = COALESCE(EmailAddress + ', ', '') 
FROM dbo.Email 
+0

Правильно, но это возвращает одну переменную. –

Смежные вопросы