有没有最简单的方法从 oracle 的电子邮件地址中只选择域名?

Posted

技术标签:

【中文标题】有没有最简单的方法从 oracle 的电子邮件地址中只选择域名?【英文标题】:Is there a simplest way to select only the domain name from email address in oracle? 【发布时间】:2019-03-11 05:37:43 【问题描述】:

我有一个名为 email_id 的表,列名称为 email_id,我在列中有这些电子邮件 ID

name@yahoo.com
name@msn.com
name@gmail.com
name@xmsoftware.com 

我只需要像这样的域名作为结果

yahoo
msn
gmail
xmsoftware 

有没有比这更简单的方法(或)任何其他功能?

select substr(email_id.email_id,(instr(email_id.email_id,'@',1)+1),(instr(email_id.email_id,'.',1) - (instr(email_id.email_id,'@',1)+1))) as domain 
from email_id;

【问题讨论】:

附带说明:为什么要剥离扩展?没有它,您将只剩下一个域名。 mysite.com 和 mysite.uk 可能是两个完全不同的东西 我对现实生活场景了解不多。这是面试官问的问题。使用 instr 和 substr 很长,所以我用谷歌搜索,但没有找到答案,我只需要知道是否有任何我不知道的功能 【参考方案1】:

我更喜欢REGEXP_SUBSTR

select REGEXP_SUBSTR(email_id,'^.*@(.*)\.(.*)$',1,1,null,1) as domain 
 FROM emails;--                     ^ first match        ^ within()

Demo

【讨论】:

@Rene : 谢谢,现在已经改正了。 @Kaushik 感谢帖子我不知道可以通过正则表达式完成,我对此知之甚少【参考方案2】:

老式方式是使用SUBSTR + INSTR组合。需要输入更多的字母(与正则表达式相比),但在大型数据集上可能会更快。

SQL> WITH email_id (email_id)
  2       AS (SELECT 'name@yahoo.com' FROM DUAL
  3           UNION ALL
  4           SELECT 'name@msn.com' FROM DUAL
  5           UNION ALL
  6           SELECT 'name@gmail.com' FROM DUAL
  7           UNION ALL
  8           SELECT 'name@xmsoftware.com ' FROM DUAL)
  9  select email_id,
 10         substr(email_id,
 11                instr(email_id, '@') + 1,
 12                instr(email_id, '.', instr(email_id, '@')) - instr(email_id, '@') - 1) result
 13  from email_id;

EMAIL_ID             RESULT
-------------------- --------------------
name@yahoo.com       yahoo
name@msn.com         msn
name@gmail.com       gmail
name@xmsoftware.com  xmsoftware

SQL>

【讨论】:

正则表达式会造成性能问题。我听说有些人说这是 y 它大多不被开发人员使用是真的还是有些难以理解 对于小型数据集,您甚至不会注意到差异。对于数百万行,您可能(并且很可能会)。如果您一次为一行选择该值,则正则表达式就可以了。

以上是关于有没有最简单的方法从 oracle 的电子邮件地址中只选择域名?的主要内容,如果未能解决你的问题,请参考以下文章

数据库迁移之从oracle 到 MySQL最简单的方法

来自 csv 文件的 PostgreSQL 查询 [重复]

数据库迁移之从oracle 到 MySQL最简单的方法

从IP地址获取用户纬度和经度的最简单方法是啥[关闭]

oracle如何屏蔽邮箱地址?

如何使用 crm 通过简单的电子邮件地址发送电子邮件?