2016-10-27 2 views
0

J'essaie de standardiser l'adresse e-mail dans un champ. Voici quelques exemples couple du problème que je tente de résoudre:Comment trouver et supprimer un jeton de courrier électronique d'une série d'e-mails dans 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] 

` Je suis en train d'extraire le courrier électronique utilisable à partir du e-mails générés automatiquement dans des chaînes similaires à cela, donc par exemple dans

(ex 1) Je voudrais l'adresse @ aol.com;
dans (ex 2) Je voudrais l'adresse @ gmail.com;
dans (ex 3) Je voudrais l'adresse @ comcast.net.

J'ai essayé de trouver le charindex des fournisseurs de services les plus populaires en utilisant une déclaration de cas, mais comme je ne sais pas combien de caractères existent avant le symbole @ je ne sais pas comment utiliser la méthode de sous-chaîne.

Il peut y avoir de 2 à 7 emails dans une chaîne. Je sais comment faire pour 2. C'était facile, mais après ça je n'en ai aucune idée. Voici ce que j'ai jusqu'à présent:

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 

J'utilise T-SQL. Aucune suggestion?

+0

si vous utilisez CHARINDEX pour trouver la position et comcast.net (par exemple) - alors vous prenez à gauche de la chaîne jusqu'à ce point - alors vous inversez la chaîne et utilisez CHARINDEX sur cela pour trouver le ';' - alors vous prenez LEFT jusqu'à ce point - alors vous avez la partie EMAIL (mais il est inversé (donc utilisez REVERSE sur cela et retournez-le à & comcast.net - vous feriez mieux de faire une fonction scalaire, où vous pouvez utiliser des variables et faire un mini-programme - je devais utiliser l'esperluette à la place de le caractère AT BTW du e à cet endroit – Cato

+1

Quel est le problème avec l'autre adresse e-mail? –

+0

@JuanCarlosOropeza Ils sont similaires aux adresses e-mail générées automatiquement lorsque vous répondez à une annonce Craigslist. Pour autant que je sache, ces adresses e-mail sont des adresses e-mail "pas de réponse". – jimjim

Répondre

0

Une meilleure façon de l'OMI serait de créer une table avec des adresses e-mail valides puis utilisez string split function .. (en supposant les adresses e-mail sont séparés par ;

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

Ils sont divisés par des points-virgules – jimjim

+0

alors cette approche devrait fonctionner – TheGameiswar