2016-08-03 32 views
0

我與Oracle DB工作,我試圖尋找和匹配特定樣式的字符串中提取所有出現...甲骨文REGEXP_SUBSTR - 尋找並提取所有出現在一列

它應該是3個字母,3個數字,然後也許一個字母或不

我嘗試這樣做:

SELECT REGEXP_SUBSTR(my_column, '[A-Za-z]{3}(\d)(\d)(\d)') AS values 
FROM my_table 

但它只返回第一次出現。

使用

REGEXP_SUBSTR(my_column, '[A-Za-z]{3}(\d)(\d)(\d)', 0, 0, 'i') 

無法正常工作或

沒有任何人有什麼想法?

編輯:

我試圖從PLSQL文件解壓縮。因此,像

select * 
from abc123 
where some_value = 'some_value' 
+0

請張貼一些樣本數據和所需結果;例如,您對'ABC123CDE456FGHI789'有什麼期望? – Aleksej

+0

regexp_substr cant accpet 0作爲參數。 –

+0

@sanjay radadiya 是的,它可以接受0作爲參數。只是不適合職位。你可以使用它作爲發生參數... – javaBeginner

回答

1

它很像SQL查詢,試試這個查詢打破ABC123CDE456FGHI789 SQUENCE

with mine as (select 'ABC123CDE456FGH789' hello from dual) 
select regexp_substr(hello, '[A-Za-z]{3}(\d){3}', 1, level) STR from mine 
connect by regexp_substr(hello, '[A-Za-z]{3}(\d){3}', 1, level) is not null 

輸出

ABC123 
CDE456 
GHI789 

爲了得到具體的現在的位置,那麼你要使用

select regexp_substr('ABC123CDE456FGH789', '[A-Za-z]{3}(\d){3}', 1, i) STR from dual 

改變我值作爲每個位置像

select regexp_substr('ABC123CDE456FGH789', '[A-Za-z]{3}(\d){3}', 1, 1) STR from dual 

輸出:

ABC123 
+0

非常感謝。這真的幫助我。 – javaBeginner

+0

有沒有辦法加快這個查詢? – javaBeginner

+0

級別查詢和正則表達式是系統設施,因此它總是比從數據庫檢索數據時快。 –

1

努力在數1.2.3(假設它是一個國家的域)

SELECT str,level,REGEXP_SUBSTR(str, '[0-9]', 1, LEVEL) AS substr 
FROM (
SELECT country_domain str from country where regexp_like(country_domain, '[0-9]') 
) 
CONNECT BY LEVEL <= REGEXP_count(str, '[0-9]'); 

輸出

STR LEVEL SUBSTR 
1.2.3 1  1 
1.2.3 2  2 
1.2.3 3  3