在oracle SQL/PLSQL中用regex_substr获取其他数字之间的特定数字

get a specific number between others numbers with regex_substr in oracle SQL/PLSQL

提问人:user22553365 提问时间:9/14/2023 最后编辑:Ryszard Czechuser22553365 更新时间:10/20/2023 访问量:51

问:

我有这个字符串'013654127411422599412405412123AB>Z4204015479'。我需要介于(可能是 10)和 之间的所有数字。99>

我试着用以下方法得到这个:

 regexp_substr('013654127411422599412405412123AB>Z4204015479','[^99|10](.)([^(>)]+)')

但它不起作用。结果是:

3654127411422599412405412123AB

预期结果:

412405412123AB

有人可以帮我吗?

SQL 正则表达式 Oracle

评论

2赞 padaleiana 9/14/2023
你能编辑你的问题并提供另一个所需结果的例子吗?
1赞 jarlh 9/14/2023
如果之前出现会有什么结果?或者,如果有一个但没有,或者但没有,或者有几个?<99<9999<
1赞 Jonas Metzler 9/14/2023
如果和/或在字符串中多次出现怎么办,如果只有一个或没有出现怎么办?99>

答:

1赞 Wiktor Stribiżew 9/14/2023 #1

你可以使用

SELECT regexp_substr(
  '013654127411422599412405412123AB>Z4204015479',
  '(99|10)(\w+)>', 1, 1, NULL, 2) AS Result;

此外,如果可以有多个单词字符,只需使用

'(99|10)([^>]+)'

正则表达式匹配并捕获到第 1 组中,然后将任何一个或多个单词字符捕获到第 2 组中,后跟字符。(99|10)(\w+)>9910>

正则表达式更通用一些,它匹配并捕获到组 2 中,然后捕获到组 2 中,而不是 。(99|10)([^>]+)9910>

请注意 中的参数,它提取存储在组 2 中的值。2regexp_substr

0赞 Littlefoot 9/14/2023 #2

它必须是正则表达式吗?因为,在大型数据集上,组合很可能会胜过它,而且相当微不足道substr + instr

示例数据(带下划线的部分表示所需的结果):

SQL> with test (col) as
  2    (select  '013654127411422599412405412123AB>Z4204015479' from dual)
  3    --                          --------------

查询:

  4  select substr(col, instr(col, '99') + 2,
  5                     instr(col, '>') - instr(col, '99') - 2
  6               ) result
  7  from test;

RESULT
--------------
412405412123AB

SQL>