У меня есть адрес электронной почты, например [email protected] и [email protected] [email protected] и т.д. Мне нужен запрос выбора Mysql, чтобы он обрезал имена пользователей и .com возвращал вывод как gmail, ymail, hotmail и т.д.
Как выбрать доменное имя с адреса электронной почты
Ответ 1
Предполагая, что домен является одним доменом, например gmail.com, yahoo.com, используйте
select (SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1),'.',1))
Внутренний SUBSTR
получает правильную часть адреса электронной почты после @
, а внешний SUBSTRING_INDEX
отключит результат в первый период.
иначе, если ожидается, что в домене будет указано несколько слов типа mail.yahoo.com
и т.д., используйте:
select (SUBSTR(email, INSTR(email, '@') + 1, LENGTH(email) - (INSTR(email, '@') + 1) - LENGTH(SUBSTRING_INDEX(email,'.',-1))))
LENGTH(email) - (INSTR(email, '@') + 1) - LENGTH(SUBSTRING_INDEX(email,'.',-1))
получит длину домена минус TLD (.com, .biz etc. part)
, используя SUBSTRING_INDEX
с отрицательным счетчиком, который будет вычисляться справа налево.
Ответ 2
Я предпочитаю:
select right(email_address, length(email_address)-INSTR(email_address, '@')) ...
поэтому вам не нужно угадывать, сколько поддоменов имеет ваш домен электронной почты пользователя.
Ответ 3
Использование SUBSTRING_INDEX для "разделения" на "@" и "." делает трюк. См. Документацию на http://dev.mysql.com/doc/refman/5.1/de/string-functions.html#idm47531853671216.
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(email, '@', -1), '.', 1);
Пример:
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX("[email protected]", '@', -1), '.', 1);
предоставит вам "бар".
Вот что происходит:
* Разделить "[email protected]" на "@". → [ "foo", "bar.buz" ]
* Выберите первый элемент справа (индекс -1). → "bar.buz"
* Split "bar.buz" at '.' → [ "bar" , "buz" ]
* Выберите первый элемент (индекс 1) → "bar"
Результат: "bar"
Если вам также нужно избавиться от поддоменов, используйте:
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(email, '@', -1), '.', -2), '.', 1);
Пример:
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX("[email protected]", '@', -1), '.', -2), '.', 1);
предоставит вам "бар".
Ответ 4
Для PostgreSQL:
split_part(email, '@', 2) AS domain
Полный запрос:
SELECT email, split_part(email, '@', 2) AS domain
FROM users;
Ссылка: http://www.postgresql.org/docs/current/static/functions-string.html
Ответ 5
Попробуйте это, удалите @из домена и просто покиньте домен, например: domain.com
select SUBSTR(SUBSTR(email_field, INSTR(email_field, '@'), INSTR(email_field, '.')), 2) as domain
Ответ 6
select (SUBSTRING_INDEX (SUBSTR (адрес электронной почты, INSTR (электронная почта, '@') + 1), '.', 1) from tableName)
Для некоторых операторов sql требуется имя таблицы, указанное в столбце электронной почты.
Ответ 7
Попробуйте следующее:
select SUBSTR(field_name, INSTR(field_name, '@'), INSTR(field_name, '.'))
Ответ 8
Мое предложение было бы (для mysql):
SELECT
LOWER(email) AS email,
SUBSTRING_INDEX(email, '@', + 1) AS account,
REPLACE(SUBSTRING_INDEX(email, '@', -1), CONCAT('.',SUBSTRING_INDEX(email, '.', -1)),'') -- 2nd part of mail - tld.
AS domain,
CONCAT('.',SUBSTRING_INDEX(email, '.', -1)) AS tld
FROM
...
ORDER BY domain, email ASC;
Ответ 9
Если вы хотите узнать наиболее часто используемые имена доменов с адресов электронной почты, которые у вас есть (могут быть полезны), вы можете сделать:
select (SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1),'.',1)) as a,count(*) as c
FROM User
group by a
order by c desc;
Результат:
Ответ 10
DECLARE @Email Varchar(20)
SET @Email='[email protected]'
SELECT SUBSTRING(@Email, CHARINDEX('@',@Email)+1,LEN(@Email))
Ответ 11
DECLARE @Email Varchar(20)
SET @Email='[email protected]'
SELECT RIGHT(@Email,LEN(@Email)-CHARINDEX('@',@Email))