искать имена в почтовом адресе

0

Ищет запрос, который соответствует точному имени в почтовый адрес. Определение точного соответствия - это когда имя является частью адреса электронной почты:

  • но не в домене (после "@")
  • не является подмножеством большего имени
  • не является подмножеством, когда оно разделяется неалфавитными символами (цифры, запятая, точка, подчеркивание и т.д.),
  • полное соответствие местной части (до "@")

Чтобы уточнить, я подготовил некоторые примеры данных:

имена таблиц

luis
mary
anne
andrew

почтовые рассылки

[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]

запрос должен вернуться:

 luis [email protected] 
 anne [email protected] 
 mary [email protected] 
 andrew [email protected]

к сожалению, операнд SELECT с LIKE возвращает много ложных срабатываний:

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

Я подготовил тестовую среду на скрипте SQL

  • 0
    jeanne_darc shold не соответствует anne , поэтому ложный положительный результат
Теги:

4 ответа

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]?.*@')
  • 0
    в качестве разделителя должны использоваться все не алфавитные символы (числа, запятая, точка, подчеркивание и т. д.)
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]+[^@]+'      ,')@')
0

Вы можете сопоставить имя и подстроку адреса до @ таблицы электронной почты

select name,address
from emails
join names 
on SubString(address,1,POSITION('@' IN address)) like concat('%',name,'%');
  • 0
    Версия 1: к сожалению, это мисс Энн , то есть не в начале адреса
  • 0
    версия 2: к сожалению, это взять Жанну Дарк
0

Вы можете использовать substring_index для этого, когда используете его, мы делаем последний параметр равным 1, поэтому он будет получать подстроку слева направо

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

sqlfiddle находится на здесь

  • 0
    к сожалению это взять Жанну Дарк

Ещё вопросы

Сообщество Overcoder
Наверх
Меню