在邮件地址中搜索姓名

时间:2018-04-06 10:41:07

标签: mysql sql

查找与确切名称匹配的查询到邮件地址。 完全匹配的定义是名称是电子邮件地址的一部分时:

  • 但不是域中的(在" @"之后)
  • 不是更大名称的子集
  • 由非字母字符(数字,逗号,点,下划线等)分隔时,
  • 不是子集。
  • 完全匹配本地部分(在" @"之前)

澄清我已准备好一些样本数据:

名称

luis.sepulveda@gmail.com
johnn@mary.com
jeanne.darc@gmail.com
smith_anne@example.com
mary1999@mail.com
andrew@hotmail.com

邮件

 luis luis.sepulveda@gmail.com 
 anne smith_anne@example.com 
 mary mary1999@mail.com 
 andrew andrew@hotmail.com

查询应返回:

SELECT

不幸的是,带有LIKE操作数的select name,address from emails join names on address like concat('%',name,'%'); 会返回大量误报:

const response = await axios.get(your_url_here);
const items = response.data.items;

我准备了test environment on SQL fiddle

4 个答案:

答案 0 :(得分:0)

您可以在电子邮件表的@之前匹配名称和地址子字符

select name,address
from emails
join names 
on SubString(address,1,POSITION('@' IN address)) like concat('%',name,'%');

答案 1 :(得分:0)

您似乎希望在 @之前的电子邮件部分匹配(至少)。您可以使用substring_index()或正则表达式处理此问题:

select n.name, e.address
from emails e join
     names n
     on substring_index(e.address, '@', 1 ) like concat('%', name, '%');

如果您正在尝试使用确切名称进行匹配,那么“anne”与“jeanne”不匹配,请考虑这些时期:

select n.name, e.address
from emails e join
     names n
     on concat('.', substring_index(e.address, '@', 1 ), '.') like concat('%.', name, '.%');

这不会捕获Anne,你可以使用正则表达式:

select n.name, e.address, concat('[^a-zA-Z]', name, '[^a-zA-Z].*@')
from emails e join
     names n
     on concat('.', e.address) regexp concat('[^a-zA-Z]', name, '[^a-zA-Z]?.*@')

答案 2 :(得分:0)

您可以使用substring_index来执行此操作,在使用它时,我们将最后一个参数设置为1,因此它将从左到右获取子字符串

select name,address
from emails
join names on SUBSTRING_INDEX(address,'@',1) like concat('%',name,'%');

sqlfiddle是at here

答案 3 :(得分:0)

为了从@GordonLinoff开始的完整性我登陆到此查询,可能是重新计算但涵盖所有情况

select name,address
from emails e
join names on
lower(e.address) regexp concat('^(',name,'|[^a-z]*',name,'[^a-z]*'   ,'|[^@]+[^a-z]+' ,name, '[^a-z@]*'  ,'|[^@a-z]*' ,name, '[^a-z]+[^@]+'      ,')@')