1

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

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

id     username     email

1      steve        steve@place.com
2      bill         bill@fake.asdf

我正在尝试检测 TLD 是否与“com”或“org”或“net”不匹配,并且仅从数据库中返回与那些特定 TLD 不匹配的值。显然在这种情况下,只会获取 id 为 2 的用户。

这必须发生在 SQL 查询中。

4

3 回答 3

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
于 2011-06-08T22:22:47.480 回答
2

使用正则表达式,

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

您可以编辑表达式以获得所需的结果。:)

于 2011-06-08T22:14:43.297 回答
0
SELECT id
FROM users
WHERE SUBSTRING_INDEX( email, '.', -1 )
        NOT IN ('com', 'net', 'org') 

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

于 2011-06-08T23:04:55.763 回答