Как извлечь несколько строк из одной строки в SQL Server - PullRequest
3 голосов
/ 30 января 2011

У меня есть, например, следующие данные таблицы:

id    |    text
--------------------------------------------------------------------------------
1     |  Peter (Peter@peter.de) and Marta (marty@gmail.com) are doing fine.
2     |  Nothing special here
3     |  Another email address (me@my.com)

Теперь мне нужно выбрать , который возвращает все адреса электронной почты из моих текстовых столбцов (можно просто проверить скобки)и это возвращает более одной строки, если в текстовом столбце есть несколько адресов.Я знаю, как извлечь первый элемент , но совершенно не знаю, как найти второй и более результат.

Ответы [ 3 ]

6 голосов
/ 30 января 2011

Вы можете использовать cte рекурсивно, чтобы вырезать строки.

declare @T table (id int, [text] nvarchar(max))

insert into @T values (1, 'Peter (Peter@peter.de) and Marta (marty@gmail.com) are doing fine.')
insert into @T values (2, 'Nothing special here')
insert into @T values (3, 'Another email address (me@my.com)')

;with cte([text], email)
as
(
    select
        right([text], len([text]) - charindex(')', [text], 0)),
        substring([text], charindex('(', [text], 0) + 1, charindex(')', [text], 0) - charindex('(', [text], 0) - 1) 
    from @T
    where charindex('(', [text], 0) > 0
    union all
    select
        right([text], len([text]) - charindex(')', [text], 0)),
        substring([text], charindex('(', [text], 0) + 1, charindex(')', [text], 0) - charindex('(', [text], 0) - 1) 
    from cte
    where charindex('(', [text], 0) > 0
)
select email
from cte

Результат

email
Peter@peter.de
me@my.com
marty@gmail.com
2 голосов
/ 31 января 2011

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

WITH basedata(id, [text])
     AS (SELECT 1, 'Peter (Peter@peter.de) and Marta (marty@gmail.com) are doing fine.'
         UNION ALL
         SELECT 2, 'Nothing special here'
         UNION ALL
         SELECT 3, 'Another email address (me@my.com)'),
     cte(id, t, x)
     AS (SELECT *,
                CAST('<foo>' + REPLACE(REPLACE([text],'(','<bar>'),')','</bar>') + '</foo>' AS XML)
         FROM   basedata)
SELECT id,
       a.value('.', 'nvarchar(max)') as address
FROM   cte
       CROSS APPLY x.nodes('//foo/bar') as addresses(a) 
0 голосов
/ 30 января 2011

Функции подстроки имеют параметр начальной позиции.Таким образом, вы находите первое вхождение и начинаете следующий поиск (в вашем цикле) с позиции вхождения + occurenceLength.Вам нужно написать функцию, которая возвращает значения в виде строки с разделителями или таблицы.Используйте знак @, чтобы найти свой адрес электронной почты, а затем отсканируйте назад и вперед, пока не достигнете пробела или символа, недопустимого в адресе электронной почты (или начального положения, или начала, или последнего символа).1001 *

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