2016-10-27 3 views
0

Я пытаюсь стандартизировать адрес электронной почты в поле. Вот несколько примеров этой проблемы я пытаюсь решить:Как найти и удалить токен электронной почты из строки писем в T-SQL?

ex 1 [email protected];[email protected];[email protected] 
ex 2 [email protected];[email protected];[email protected] 
ex 3 [email protected];[email protected];[email protected];[email protected] 

` Я пытаюсь извлечь полезную электронную почту от автогенерируемых писем в строках, подобных этому, так, например, в

(ex 1) Я хотел бы адрес @ aol.com;
in (ex 2) Я хотел бы адрес @ gmail.com;
in (ex 3) Я хотел бы адрес @ comcast.net.

Я попытался найти charindex из самых популярных поставщиков услуг, используя оператор case, но так как я не знаю, сколько символов существует перед символом @, я не понимаю, как использовать метод подстроки.

В строке может быть от 2 до 7 писем. Я знаю, как это сделать для 2. Это было легко, но после этого я понятия не имею. Вот что я до сих пор:

select email, len(email) - len(replace(email,';','')) num_semi 
into #tmp1 
from staging_transformations 
where email != '' 
order by len(email) - len(replace(email,';','')) desc 


select email, 
case 
    when num_semi = 1 then 
     case 
      when SUBSTRING(email,0,charindex(';',email)) like '%@anon.cargurus.com' then 
       case 
        when SUBSTRING(email,charindex(';',email) + 1,len(email)) like '%@anon.cargurus.com' then NULL 
        else SUBSTRING(email,charindex(';',email) + 1,len(email)) 
       end 
      when SUBSTRING(email,0,charindex(';',email)) like '%@geico.zagdealer.com' then 
       case 
        when SUBSTRING(email,charindex(';',email) + 1,len(email)) like '%@geico.zagdealer.com' then NULL 
        else SUBSTRING(email,charindex(';',email) + 1,len(email)) 
       end 
      when SUBSTRING(email,0,charindex(';',email)) like '%@truecarcustomer.com' then 
       case 
        when SUBSTRING(email,charindex(';',email) + 1,len(email)) like '%@truecarcustomer.com' then NULL 
        else SUBSTRING(email,charindex(';',email) + 1,len(email)) 
       end 
      when SUBSTRING(email,0,charindex(';',email)) like '%@carbuyingemail.com' then 
       case 
        when SUBSTRING(email,charindex(';',email) + 1,len(email)) like '%@carbuyingemail.com' then NULL 
        else SUBSTRING(email,charindex(';',email) + 1,len(email)) 
       end 
      else SUBSTRING(email,0,charindex(';',email)) 
     end 
    else email 
end test, 
num_semi 
from #tmp1 

Я использую T-SQL. Какие-либо предложения?

+0

если вы используете CHARINDEX, чтобы найти положение и comcast.net (например) - тогда вы берете LEFT строки до этой точки - тогда вы ОБЛАДАЕТСЯ в строку и используете CHARINDEX для этого, чтобы найти «;» - тогда вы берете LEFT до этой точки - тогда у вас есть EMAIL-часть имени (но он работает в обратном порядке (поэтому используйте REVERSE для этого и присоедините его обратно к & comcast.net - вам лучше всего создать скалярную функцию, где вы можете использовать переменные и сделать мини-программу - мне пришлось использовать амперсанд вместо символ AT BTW du e в это место – Cato

+1

Что не так с другим адресом электронной почты? –

+0

@JuanCarlosOropeza Они похожи на автоматически созданные адреса электронной почты, когда вы отвечаете на объявление craigslist. Насколько я знаю, эти адреса электронной почты являются «нет ответа» на электронные адреса. – jimjim

ответ

0

Один лучше IMO способом было бы создать таблицу с действительными адресами электронной почты, а затем использовать string split function .. (предполагающие адреса электронной почты разделённых ;

declare @string varchar(max) 
set @string='[email protected];[email protected];[email protected]' 


create table validemails 
(
emailid varchar(50) 
) 

insert into validemails 
select '@aol.com' 

;with cte 
as 
(select * from 
[dbo].[SplitStrings_Numbers](@string,';') 
) 
select * from cte c 
cross apply 
(
select * from validemails b where c.item like '%'+b.emailid+'' 
) d 
+0

Они разделены точкой с запятой – jimjim

+0

, тогда этот подход должен работать – TheGameiswar