2016-11-07 83 views
3

我有一個字符串,包含3個部分,整個字符串是:如何使用regexp_substr在oracle中分割單詞?

`aUNITED STATES :bUSCOMPANY,c7/1990.`    

我如何通過單獨使用甲骨文regexp_substr得到3個部分,而不小寫字符?

結果應該是:

UNITED STATES : 
USCOMPANY, 
7/1990. 

我曾嘗試下面的代碼。

select REGEXP_SUBSTR('aUNITED STATES :bUSCOMPANY,c7/1990.', '[^a-z]+') 
from dual; 

我可以成功獲得UNITED STATES :,但是如何獲得其他結果?

+0

你有一列這些字符串?並且它們是否都具有與所示相同的確切模式? –

+0

是的,該列包含與所示具有相同確切模式的所有字符串。 –

+0

到目前爲止你嘗試了什麼?發佈您的代碼!當你運行它時發生了什麼?你預期會發生什麼?你有什麼特別的問題?解決此問題後,您可能需要查看數據庫設計和規範化表格。 – Robert

回答

1

您可以用substrinstr組合去做,因爲字符串模式是一致的。

select 
--replace col with the column name from the table 
substr(col,2,instr(col,':')-1) part_1, 
substr(col,instr(col,':')+2,instr(col,',')-instr(col,':')-1) part_2, 
substr(col,instr(col,',')+1) part_3 
from yourtable 
0

1)Fisrt選項。用正則表達式。

select regexp_substr('aUNITED STATES :bUSCOMPANY,c7/1990.','[a-z](.*)[a-z](.*)[a-z](.*)',1,1,null,1) 
    , regexp_substr('aUNITED STATES :bUSCOMPANY,c7/1990.','[a-z](.*)[a-z](.*)[a-z](.*)',1,1,null,2) 
    , regexp_substr('aUNITED STATES :bUSCOMPANY,c7/1990.','[a-z](.*)[a-z](.*)[a-z](.*)',1,1,null,3) 
    from dual; 

REGEXP_SUBSTR允許從字符串regexp_substr - desc提取正則表達式組。該組由「 」括號「(.......)」定義。

2)的XQuery/XMLTABLE

select xmlcast(c.column_value as varchar2(200)) from xmltable('for $i in ora:tokenize($str,"[a-z]") 
               where string-length($i) >0 
               return $i' passing 'aUNITED STATES :bUSCOMPANY,c7/1990.' as "str") c; 

ora:tokenize($str,"[a-z]") - 分割字符串轉換成使用reg_exp模式字符串sequnect。 語法內XMLTABLE被稱爲 「FLWOR表達式」

0
select regexp_substr ('aUNITED STATES :bUSCOMPANY,c7/1990.','^a([^b]*)',1,1,'c',1) 
     ,regexp_substr ('aUNITED STATES :bUSCOMPANY,c7/1990.','b([^c]*)' ,1,1,'c',1) 
     ,regexp_substr ('aUNITED STATES :bUSCOMPANY,c7/1990.','c(.*)$' ,1,1,'c',1) 

from dual 
; 

select regexp_substr ('aUNITED STATES :bUSCOMPANY,c7/1990.','[a-c]([^a-c]*)',1,1,'c',1) 
     ,regexp_substr ('aUNITED STATES :bUSCOMPANY,c7/1990.','[a-c]([^a-c]*)',1,2,'c',1) 
     ,regexp_substr ('aUNITED STATES :bUSCOMPANY,c7/1990.','[a-c]([^a-c]*)',1,3,'c',1) 

from dual 
; 

select regexp_substr ('aUNITED STATES :bUSCOMPANY,c7/1990.','[^a-c]*',1,2) 
     ,regexp_substr ('aUNITED STATES :bUSCOMPANY,c7/1990.','[^a-c]*',1,4) 
     ,regexp_substr ('aUNITED STATES :bUSCOMPANY,c7/1990.','[^a-c]*',1,6) 

from dual 
; 

select regexp_substr ('aUNITED STATES :bUSCOMPANY,c7/1990.','^a(.*?)b',1,1,'c',1) 
     ,regexp_substr ('aUNITED STATES :bUSCOMPANY,c7/1990.','b(.*?)c' ,1,1,'c',1) 
     ,regexp_substr ('aUNITED STATES :bUSCOMPANY,c7/1990.','c(.*)$' ,1,1,'c',1) 

from dual 
;