Нужна помощь раздражающего оператора SQL - PullRequest
0 голосов
/ 19 декабря 2011

У меня есть таблица, в которой есть столбец с разделенными запятыми адресами электронной почты. Есть ли способ в одном операторе select разобрать их и создать для них группу?

В такой таблице:

ID     Emails
1      email@domain.com, email2@domamin.com
2      email2@domain.com, email3@domain.com

Возвращает что-то вроде:

Email                Count
email@domain         1
email2@domain.com    2
email3@domain.com    1 

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

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 19 декабря 2011

Вы можете преобразовать свой список адресов электронной почты в XML и затем запросить XML, используя .nodes и .value.

declare @T table
(
  ID int,
  Emails varchar(100)
)

insert into @T values
(1, 'email@domain.com, email2@domain.com'),
(2, 'email2@domain.com, email3@domain.com')

select T.Email, count(*) as [Count]
from (
      select X.N.value('.',  'varchar(30)') as Email
      from @T
        cross apply (select cast('<x>'+replace(Emails, ', ', '</x><x>')+'</x>' as xml)) as T(X)
        cross apply T.X.nodes('/x') as X(N)
     ) as T
group by T.Email

Результат:

Email                          Count
------------------------------ -----------
email@domain.com               1
email2@domain.com              2
email3@domain.com              1
0 голосов
/ 19 декабря 2011

Мне придется немного посидеть и переварить это, потому что раньше я никогда не играл с MSSQL xml, но я изменил его, чтобы использовать свое реальное имя таблицы, и оно работает ОТЛИЧНО, о боже, спасибо вам большое.Вот что я сделал (в случае, если кто-то хочет использовать это без временной таблицы, как я):

select T.Email, count(*) as [Count] 
from ( 
      select X.N.value('.',  'varchar(30)') as Email 
      from reports_schedule rs
        cross apply (select cast('<x>'+replace(rs.recipient_email, ', ', '</x><x>')+'</x>' as xml)) as T(X) 
        cross apply T.X.nodes('/x') as X(N) 
     ) as T 
group by T.Email 

еще раз спасибо!

0 голосов
/ 19 декабря 2011

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

Рекурсивный CTE, как это было сделано, должен работать.

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