【问题标题】:regexp_like: IDs with n digits, not n+1regexp_like:具有 n 个数字的 ID,而不是 n+1
【发布时间】:2017-08-03 07:31:10
【问题描述】:

我想从 varchar 列中过滤 5 位 ID(不仅包含 ID,还包含更多文本),并且我必须避免选择包含“偶然”搜索的 6 位或更多位 ID 5位数字,所以简单的“喜欢”是行不通的。 我在搜索的 ID 前后使用[^0-9]* 尝试了“regexp_like”,但看起来 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 行应该被选中。

请你帮帮我。

非常感谢!

【问题讨论】:

  • 如果值为612345 12345,那么是否应该选择?
  • YES,因为“612345 12345”包含(在第二部分中)“12345”,没有直接的前导或尾随数字。

标签: sql oracle


【解决方案1】:

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

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

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

另见SQLFiddle

【讨论】:

  • 对非数字使用 \D '(^|\D+)12345(\D+|$)'
  • 非常感谢! (似乎我对 0+ 与负选择相结合感到困惑 ;-)
猜你喜欢
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
相关资源
最近更新 更多