2015-11-25 93 views
0

我有中获取正确的数据列的麻烦,使用正则表达式在甲骨文11“正则表达式样” Oracle中返回结果不准确

列是varchar类型,看起来像这样:

2216xxxx 
20xxxx 
2355xxxx 
2128xxxx 
213xxxx 
692xxxx 

我使用的查询的该部分:

regexp_like (column_name, '^(?216*|?213*|?218*|?212*|?249*|?20*)') 

以滤除与20,216,213,218,与这些前缀开始212和249,或者开始的行,之前是2(例如。 220,2216,2213等),但在结果中,我也获得了以2355开始的记录。

我确信我对正则表达式犯了一些错误,但我无法找到它。

一些帮助将不胜感激。

P.S

我知道我可以用一系列的“or column_name like...”去,但我认为使用regexs会是一个更好的解决方案

+1

''表示? “0或1的一个组或字符 - 尝试删除所有'?',看看会发生什么 –

+0

@MacroMan我试图删除它,但我仍然从2355开始获取这些记录。当我第一次添加?时,我想包括2,在某些情况下碰巧是这样,而在另一些情况下则不是...... – gm08

回答

1

您使用?*不正确。用这个来代替:

^(216.*|213.*|218.*|212.*|249.*|20.*) 

你不需要?,你需要使用.*这意味着“任何字符(除新行),零和无限次量之间”

+0

这次它删除了不需要的记录,即以'2355'开头的记录,但它也删除了我想包含的记录,一个人使用上面的前缀,但在开始处有一个数字“2”。简而言之,我想要所有以'216'或'2216'开始的记录,等等...... – gm08

+0

在组前添加一个可选项2。''^(2)?(216. * | 213 * | 218 * | 212 * | 249 * | 20 *)''。彻底测试! –

+1

为什么重复'。*'和'2'这么多次? ' '^ 2 2?(16 | 13 | 18 | 12 | 49 | 0)。*''。或甚至是'^ 2?2(1 [6382] | 49 | 0)。'' –

相关问题