Определить 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 поле в таблице и индекс в этом поле.

Другие вопросы по тегам