regexp_like:具有n位数的ID,而不是n + 1

时间:2017-08-03 07:31:10

标签: sql oracle

我希望从varchar列中过滤掉5位数的ID(不仅包含ID,还包含更多文本),我必须避免选择包含"的6个或更多数字ID。偶然"搜索到的5个数字,所以简单地"喜欢"不行。 我试过" regexp_like"在搜索到的ID之前和之后[^0-9]*,但看起来好像0到n重复(*)被否定的数字选择(^)弄糊涂了。

select *
from
  (     select 1 nr, '12345'   txt from dual
  union select 2 nr, '612345'  txt from dual
  union select 3 nr, 'B12345'  txt from dual
  union select 4 nr, '7612345' txt from dual
  union select 5 nr, '7 12345' txt from dual
  union select 6 nr, 'x12345x' txt from dual
  union select 7 nr, 'x12x45x' txt from dual
  union select 8 nr, ' 12345'  txt from dual
  )
where regexp_like (txt,'[^0-9]*12345[^0-9]*')
order by nr

我需要选择" 12345"的所有出现,除了带有前导或尾随其他数字的那些(例如" 612345")。应允许前导或尾随字符空白,其他符号或行尾/结尾。 因此,只应选择第1,3,5,6和8行。

你能帮帮我吗?

非常感谢!

1 个答案:

答案 0 :(得分:0)

当您使用*时,您正在搜索0次或更多次匹配,但仍然匹配612345,您可以执行以下操作:

where regexp_like(txt, '(^|[^0-9]+)12345([^0-9]+|$)')

(使用+确保您匹配至少一个非数字字符|或位于开头或结尾处)

另见SQLFiddle