2016-11-24 26 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

相關問題