Как найти строку в большом значении описания

У меня есть 2 идентификатора столбца и description.I хочу получить только mailid для каждого столбца ID.

ID Description 1 I have 2 mailID please note this mai1: [email protected] and mai1: [email protected] and mai1: [email protected] abbaaabbbbbbb. 2 I have 2 mailID please note this mai1: [email protected] and mai1: [email protected] and mai1: [email protected] abbaaabbbbbbb. 

Ожидаемый результат

 ID Description 1 [email protected] 1 [email protected] 1 [email protected] 2 [email protected] 2 [email protected] 2 [email protected] 

Я пробовал этот ниже запрос.

 SELECT id,Description FROM sample_for WHERE CHARINDEX('@', Description) > 0 

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

Может быть, что-то вроде этого …

Данные испытаний

 Declare @table TABLE(ID int , Description Varchar(8000)) INsert into @table values (1 , 'I have 2 mailID please note this mai1: [email protected] and mai1: [email protected] and mai1: [email protected] abbaaabbbbbbb'), (2 , 'I have 2 mailID please note this mai1: [email protected] and mai1: [email protected] and mai1: [email protected] abbaaabbbbbbb') 

запрос

 Select ID ,LEFT(RTRIM(LTRIM(Emails)) , CHARINDEX(' ' , RTRIM(LTRIM(Emails)))) Emails from ( SELECT t.ID ,Split.a.value('.', 'VARCHAR(100)') Emails FROM (SELECT Cast ('<X>' + Replace(Description, ':', '</X><X>') + '</X>' AS XML) AS Data ,ID FROM @table ) AS t CROSS APPLY Data.nodes ('/X') AS Split(a) )a Where a.emails LIKE '%@%' 

Набор результатов

 ╔════╦════════════════════╗ ║ ID ║ Emails ║ ╠════╬════════════════════╣ ║ 1 ║ [email protected] ║ ║ 1 ║ [email protected] ║ ║ 1 ║ [email protected] ║ ║ 2 ║ [email protected] ║ ║ 2 ║ [email protected] ║ ║ 2 ║ [email protected] ║ ╚════╩════════════════════╝ 
 DECLARE @xml xml --- Remove from here... ;WITH cte AS ( SELECT * FROM (VALUES (1, 'I have 2 mailID please note this mai1: [email protected] and mai1: [email protected] and mai1: [email protected] abbaaabbbbbbb.'), (2, 'I have 2 mailID please note this mai1: [email protected] and mai1: [email protected] and mai1: [email protected] abbaaabbbbbbb.') ) as t(ID, [Description]) ) -- To here SELECT @xml = ( SELECT CAST('<i id="' + CAST(id as nvarchar(10)) + '"><a>' +REPLACE([Description],' ','</a><a>') +'</a></i>' as xml) FROM cte -- here change cte to your table name FOR XML PATH ('') ) SELECT tvvalue('../@id', 'int') as id, tvvalue('.', 'nvarchar(100)') as email FROM @xml.nodes('/i/a') as t(v) WHERE tvvalue('.', 'nvarchar(100)') like '%@%' 

Вывод:

 id email 1 [email protected] 1 [email protected] 1 [email protected] 2 [email protected] 2 [email protected] 2 [email protected] 
 SELECT SUBSTRING(Description, CHARINDEX('mai1:', Description) + 5, CHARINDEX('mai1:', Description)) FROM Table WHERE Description LIKE '%mai1:%' AND CHARINDEX('mai1:', Description) > 0 

Не столь надежное решение из-за моих ограниченных знаний SQL-сервера (возможно, это сделало бы это с REGEXP_SUBSTR в oracle). Он ограничен 3 или менее электронными письмами и должен быть расширен вручную, если требуется больше. Одно из других опубликованных решений, вероятно, лучше, но просто захотелось включить это здесь:

 with temp(ID, Description) as( select 1, 'I have 2 mailID please note this mai1: [email protected] and mai1: [email protected] and mai1: [email protected] abbaaabbbbbbb.' union all select 2, 'I have 2 mailID please note this mai1: [email protected] and mai1: [email protected] and mai1: [email protected] abbaaabbbbbbb.' ) SELECT ID, EMAIL from ( select ID, case when start1 > 0 then substring(Description, start1+2, end1-start1+2) end email1, case when start2 > 0 then substring(Description, start2+2, end2-start2+2) end email2, case when start3 > 0 then substring(Description, start3+2, end3-start3+2) end email3 from ( select ID, Description, start1 = ISNULL(CHARINDEX(':', Description, 0),0), start2 = ISNULL(CHARINDEX(':', Description, CHARINDEX(':', Description, 0)+1),0), start3 = ISNULL(CHARINDEX(':', Description, CHARINDEX(':', Description, CHARINDEX(':', Description, 0)+1)+1),0), end1 = ISNULL(CHARINDEX('.com', Description, 0),0), end2 = ISNULL(CHARINDEX('.com', Description, CHARINDEX('.com', Description, 0)+4),0), end3 = ISNULL(CHARINDEX('.com', Description, CHARINDEX('.com', Description, CHARINDEX('.com', Description, 0)+4)+4),0) from temp ) as pos ) temp1 CROSS APPLY ( VALUES (email1), (email2), (email3) ) temp2 (email) where EMAIL is NOT NULL 
Interesting Posts

Как сохранить идентификатор модификатора в системных версиях временных таблиц?

Ошибка подключения репликации SQL Server

Медленная производительность при использовании OFFSET / FETCH с использованием полного текста в SQL Server 2012

Как преобразовать varchar в отрицательное число?

Сортировать по дате на выбранном отдельном запросе

Как получить только часть даты при использовании dateadd () и getdate ()

Установить переменную с помощью запроса select с именем динамической схемы

Запрос выполняется быстро, но работает медленнее в хранимой процедуре

MS SQL Server 2008 "с (nolock)" эквивалент для IBM DB2 9.7

Использование SQL Server 2012 LAG

XOR в SQL Server

UPDATE, если существует else INSERT в SQL Server 2008

SQl Management Studio – найдите «Rows Affected» перед запуском приложения обновления

Поведение SqlConnection при изменении уровня изоляции в SQL

Использование неинтерактивной учетной записи службы для SQL Server

Давайте будем гением компьютера.