Определить TLD в адресе электронной почты с помощью SQL-запроса
Мне нужно обнаружить TLD в большой базе данных адресов электронной почты пользователей с помощью SQL-запроса.
Адреса электронной почты хранятся в виде поля подряд. Это организовано вроде как:
id username email
1 steve steve@place.com
2 bill bill@fake.asdf
Я пытаюсь определить, не соответствует ли TLD "com", "org" или "net", и ТОЛЬКО вернуть те значения из базы данных, которые не соответствуют этим конкретным TLD. Очевидно, что в этом случае будет выбран только пользователь с идентификатором 2.
Это должно произойти в запросе SQL.
3 ответа
Ну, возможно, есть лучший способ сделать это в вашей конкретной системе, но он не использует никаких специфичных для БД функций. Кроме того, если в какой-то момент вы решите прочитать список исключений из таблицы вместо того, чтобы жестко его кодировать, это дает возможность для готовой модификации.
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
Используйте REGEXP,
SELECT fields FROM table WHERE email REGEXP '^(net|org|com)$';
Вы можете редактировать выражение, чтобы получить желаемый результат.:)
SELECT id
FROM users
WHERE SUBSTRING_INDEX( email, '.', -1 )
NOT IN ('com', 'net', 'org')
Однако вы запускаете это (это легко использовать LIKE
вместо этого), это не будет быстрым. Если вы хотите, чтобы запросы, которые выполняют поиск в TLD электронной почты (с тысячами или миллионами строк в таблице), и запросы были быстрыми, вы можете добавить tld
поле в таблице и индекс в этом поле.