如何从电子邮件地址select域名

我有一个电子邮件地址,如user1@gmail.com和user2@ymail.com user3@hotmail.com …等我想要一个Mysql的select查询,以便它将修剪用户名和.com一个返回输出为gmail,ymail, hotmail等

假设该域名是像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与负计数从右到左计算。

我更喜欢:

 select right(email_address, length(email_address)-INSTR(email_address, '@')) ... 

所以您不必猜测用户的电子邮件域有多less个子域。

使用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("foo@bar.buz", '@', -1), '.', 1); 

会给你“吧”。

这是发生了什么事情:
*在“@”分割“foo@bar.buz”。 – > [“foo”,“bar.buz”]
*从右边挑选第一个元素(索引-1)。 – >“bar.buz”
*在“'分割”bar.buz“。 – > [“bar”,“buz”]
*select第一个元素(索引1) – >“bar”
结果:“酒吧”

如果您还需要删除子域名,请使用:

 SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(email, '@', -1), '.', -2), '.', 1); 

例:

 SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX("foo@1.2.3.bar.buz", '@', -1), '.', -2), '.', 1); 

会给你“吧”。

试试这个,从域中删除@并离开域,例如:domain.com

selectSUBSTR(SUBSTR(email_field,INSTR(email_field,'@'),INSTR(email_field,'。')),2)作为域

对于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

感谢https://stackoverflow.com/a/19230892/1048433

从tableName中select(SUBSTRING_INDEX(SUBSTR(email,INSTR(email,'@')+ 1),'。',1)

一些sql语句需要指定邮件列所属的表名。

尝试这个:

 select SUBSTR(field_name, INSTR(field_name, '@'), INSTR(field_name, '.')) 

我的build议是(对于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; 

如果您想知道您使用的电子邮件地址中最常用的域名(可以是有用的),则可以执行以下操作:

 select (SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1),'.',1)) as a,count(*) as c FROM User group by a order by c desc; 

结果:

在这里输入图像说明

 DECLARE @Email Varchar(20) SET @Email='abc@gmail.com' SELECT SUBSTRING(@Email, CHARINDEX('@',@Email)+1,LEN(@Email)) 
 DECLARE @Email Varchar(20) SET @Email='abc@gmail.com' SELECT RIGHT(@Email,LEN(@Email)-CHARINDEX('@',@Email))