2016-08-03 65 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