Определить TLD в адресе электронной почты с помощью SQL-запроса - PullRequest
1 голос
/ 09 июня 2011

Мне нужно обнаружить TLD в большой базе данных адресов электронной почты пользователей с помощью SQL-запроса.

Адреса электронной почты хранятся в виде поля в строке.Это организовано примерно так:

id     username     email

1      steve        steve@place.com
2      bill         bill@fake.asdf

Я пытаюсь определить, не совпадает ли TLD с "com", "org" или "net", и ТОЛЬКО возвращает те значения из базы данных, которые не соответствуютсопоставьте эти конкретные TLD.Очевидно, что в этом случае будет выбран только пользователь с идентификатором 2.

Это должно происходить в запросе SQL.

Ответы [ 3 ]

2 голосов
/ 09 июня 2011

Что ж, возможно, есть лучший способ сделать это в вашей конкретной системе, но он не использует никаких функций, специфичных для БД.Кроме того, если в какой-то момент вы решите прочитать исключающий список из таблицы, а не жестко его кодировать, это подойдет для готовой модификации.

select users.*
from users
left join (
  select 'com' as tld
  union all select 'net'
  union all select 'org'
) tlds on users.email like '%.' || tld
where tlds.tld is null
2 голосов
/ 09 июня 2011

Используйте REGEXP,

SELECT fields FROM table WHERE email REGEXP '^(net|org|com)$';

Вы можете редактировать выражение, чтобы получить желаемый результат. :)

0 голосов
/ 09 июня 2011
SELECT id
FROM users
WHERE SUBSTRING_INDEX( email, '.', -1 )
        NOT IN ('com', 'net', 'org') 

Однако, если вы запустите это (вместо этого просто использовать LIKE), это не будет быстрым. Если вы хотите, чтобы запросы, которые выполняют поиск в TLD электронных писем (с тысячами или миллионами строк в таблице), и запросы были быстрыми, вы можете добавить поле tld в таблицу и индекс в этом поле.

...