2016-11-24 89 views
0

我有一个表中有一列NVARCHAR2数据类型包含一个字符串。 该字符串包含一些电子邮件ID,我需要以逗号分隔的方式提取。从NVARCHAR2获取电子邮件地址DATATYPE

下面是测试数据 -

create table nvarchar2_email (email_reject nvarchar2(1000)); 

insert into nvarchar2_email values ('com.wm.app.b2b.server.ServiceException:  javax.mail.SendFailedException: Invalid Addresses; nested exception is: 
com.sun.mail.smtp.SMTPAddressFailedException: 550 5.1.1 <[email protected]>: Recipient address rejected: User unknown in virtual alias table; 
nested exception is: 
com.sun.mail.smtp.SMTPAddressFailedException: 550 5.1.1 <[email protected]>: Recipient address rejected: User unknown in virtual alias table 
nested exception is: 
com.sun.mail.smtp.SMTPAddressFailedException: 550 5.1.1 <[email protected]>: Recipient address rejected: User unknown in virtual alias table'); 

insert into nvarchar2_email values ('com.wm.app.b2b.server.ServiceException: javax.mail.SendFailedException: Invalid Addresses; nested exception is: 
com.sun.mail.smtp.SMTPAddressFailedException: 550 5.1.1 <[email protected]>: Recipient address rejected: User unknown in virtual alias table; 
nested exception is: 
com.sun.mail.smtp.SMTPAddressFailedException: 550 5.1.1 <[email protected]>: Recipient address rejected: User unknown in virtual alias table'); 

我尝试使用下面的SQL但重复的电子邮件ID!

select email_rejetc, listagg(REGEXP_substr (email_rejetc,'[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4}', 1,level), ',') within group (order by email_rejetc) invalid_email 
from nvarchar2_email 
connect by level <= REGEXP_count (email_rejetc,'[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4}') 
group by EMAIL_REJETC 

这里所要求的输出是等

[email protected],[email protected],[email protected] 

电子邮件可以在表中的不同的行而变化的数量;

我的DB是: Oracle数据库11g企业版发布11.2.0.3.0 - 64位生产

回答

2
select (select   listagg (regexp_substr(cast(e.email_reject as varchar2(1000)),'<(.*[email protected]*?)>',1,level,'',1),',') 
          within group (order by e.email_reject) 
     from   dual 
     connect by  level <= regexp_count (e.email_reject,'<.*[email protected]*?>') 
     )  as emails       

from  nvarchar2_email e 
; 

P.

regexp_substr和nvarchar似乎存在问题,导致结果中的每个字符都以\ 0开头。
测试Oracle数据库11g快捷版发布11.2.0.2.0 - 64位生产

+0

伟大的工作很好非常感谢 – mradul

0

根据你的榜样,它会出现在E-mail地址总是呈现为<[email protected]>,意思是< ,中间有@的字符串,以及>的符号。

你可以尝试这样的事情(不能检查语法,所以你可能需要做一些测试):

SUBSTR(<input string>            , 
     INSTR(<input string>,'<') + 1        , 
     (INSTR(<input string>,'>') - INSTR(<input string>,'<') - 2 
     ) ; 

这将在字符串中产生FIRST E-mail地址。您可以在循环中使用相同的概念(提供一个没有包含第一个电子邮件地址的第一部分的字符串)来提取同一字符串中的其他地址。

我看不到通过单个“SELECT”语句执行此操作的方法,因为每个字符串可能有多个(并非全部字符串都是相同数量的)地址。

调查的一个选项是实现递归选择(Oracle支持这一点),但它会复杂得多。

就我个人而言,我会采取上述建议的方法。

+0

我试着用INSTR SUBSTR在我的第一次尝试,但它总是给我的第一封电子邮件ID唯一,而如果我声明的<,>在INSTR位置函数移动到第二个电子邮件地址,我只需要在SQL中这样做,因为它是需求。 – mradul

+0

确实。在找到第一个搜索结果后,您需要将下一个搜索的开头(针对'<')移至**电子邮件地址结尾处的**后面。这就是为什么我提到你需要为每个字符串实现一个简单的循环。 – FDavidov

相关问题