2011-06-08 80 views
1

我需要通过SQL查询在用户电子邮件地址的大型数据库上检测TLD。通过SQL查询在电子邮件地址中检测TLD

电子邮件地址作为一个字段存储在一行中。它的组织kindof像:

id  username  email 

1  steve  [email protected] 
2  bill   [email protected] 

我想检测,如果TLD不匹配“COM”或“组织”或“网”,只有从这些不匹配数据库返回的值特定的顶级域名。很明显,在这种情况下,只有id 2的用户才会被提取。

这必须发生在SQL查询中。

+0

用户表有多大? – 2011-06-08 22:25:38

+0

哪个RDBMS? (MySQL,Oracle,SQL-Server,...) – 2011-06-08 22:26:43

+0

@ypercube成千上万的成员和mysql。 – Cyclone 2011-06-08 22:59:53

回答

2

使用REGEXP,

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

您可以编辑表达式,以获得期望的结果。 :)

+0

它看起来像你可能想要删除那个“^” – thomasrutter 2016-04-20 05:41:08

2

那么,可能有更好的方法在您的特定系统中执行此操作,但这不会使用任何特定于DB的功能。另外,如果您决定在某个时候从表中读取排除列表而不是对其进行硬编码,则可以对其进行修改。

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 
0
SELECT id 
FROM users 
WHERE SUBSTRING_INDEX(email, '.', -1) 
     NOT IN ('com', 'net', 'org') 

但是你运行这个(很容易使用LIKE代替),它不会要快。如果您想要查询电子邮件的TLD(表中有成千上万或上百万行)并且查询速度很快,则可以在表中添加一个tld字段,并在该字段中添加一个索引。

相关问题