有没有最简单的方法从 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 的电子邮件地址中只选择域名?的主要内容,如果未能解决你的问题,请参考以下文章