如何从oracle中的字符串中获取固定长度的数字

Posted

技术标签:

【中文标题】如何从oracle中的字符串中获取固定长度的数字【英文标题】:How to get fixed length number from a string in oracle 【发布时间】:2015-12-03 04:35:24 【问题描述】:

我想从 var-char 字段中获取固定长度的数字。假设我有一个像 text1234567890fortex23466666sortes1234567890123 这样的字符串,那么我想获取哪个数字在字符之间连续固定 10 位数字,即 1234567890 并且我的数据也像 @ 987654323@ 那么输出应该是 0987654321

【问题讨论】:

【参考方案1】:

使用

Select regexp_substr ( <text>, '(^|[^0-9])[0-9]10([^0-9]|$)' ) from dual;

提取第一次出现的最大 10 位数字。您必须对结果进行后处理以删除封闭的非数字。重复基于正则表达式的提取的完整解决方案是:

Select regexp_substr (
             regexp_substr ( <text>, '(^|[^0-9])[0-9]10([^0-9]|$)' ) 
           , '[0-9]10'
       )
  from dual
     ;

或者,按案例分解预处理:

Select case length(i.interim)
           When 10 then i.interim
           When 12 then substr(i.interim, 2, 10 )
           Else case when regexp_instr(i.interim, '[0-9]') = 1
                     Then substr ( i.interim, 1, 10 )
                     Else substr ( i.interim, 2 )
                End
       End
  From (
           Select regexp_substr ( <text>, '(^|[^0-9])[0-9]10([^0-9]|$)' ) interim from dual
       ) i
     ;

如果你想避免多次调用正则表达式函数,你需要求助于regexp_replace

Select regexp_replace( <text>, '^(.*[^0-9])?([0-9]10)([^0-9].*)?$', '\2' ) from dual;

注意

在 12c 中,regexp_substr 补充了一个新参数,以返回一个完整匹配的捕获组:

Select regexp_substr ( <text>, '(^|[^0-9])([0-9]10)([^0-9]|$)', 1, 1, '', 2 ) from dual;

最后一个参数表示捕获组,中间的参数分别表示匹配、出现和匹配参数的开始位置;详情请见the oracle docs。

【讨论】:

谢谢,您的第一个解决方案工作正常,但不是使用两次 REGEXP_SUBSTR 而是使用单个 REGEXP_SUBSTR 可以获得相同的结果 在 11g2 中,regexp_substr 只能提取整个匹配项。这将包括任何周围的非数字。 Afaik Oracle 的正则表达式语法不支持环视语法。 12c 向 regexp_substr 引入了一个新参数,该参数指定要返回的捕获组,而不是完全匹配。或者,使用 regexp_replace(调整模式以匹配完整的字符串)。我会相应地补充我的答案。 我们只使用 oracle12c。您能否在 12c 中使用单个 REGEXP_SUBSTR 提供相同的功能

以上是关于如何从oracle中的字符串中获取固定长度的数字的主要内容,如果未能解决你的问题,请参考以下文章

当字符串的长度改变时,如何从字符串中获取数字?

java 正则表达式 如何匹配固定长度的数字

oracle 如何判断数字字串中是不是含有英文字母

Oracle中如何截取字符串的后10位

如何在 Excel 中将前导零添加到固定的字母数字长度? [复制]

Oracle二维表的创建与约束以及修改