如何从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中的字符串中获取固定长度的数字的主要内容,如果未能解决你的问题,请参考以下文章