在Oracle数据库中,我有一个字符串,例如12.13 this is a test
。我正在使用regexp_substr尝试仅提取13
。那是点后面和空格之前的数字。我尝试了各种组合,但(string, '\.[0-9]{1,}')
最接近,但我仍然得到.13
。有什么方法可以返回13
吗?
数据还包括1.1
之类的项目。数字最多为99.99
。
所有可能的数字格式为:#.#
,#.##
,##.#
,##.##
答案 0 :(得分:1)
鉴于输入字符串将始终具有前导数字和点,因此可以使用regexp_substr
提取小数。也可以使用regexp_replace
。
以下是regexp_substr
的一些示例。这些工作包括一个针对所需数据的捕获组和一个subexpression
参数(regexp_substr
中的最后一个参数):
SELECT REGEXP_SUBSTR('12.13 this is a test','^[0-9]{1,}[.]{1}([0-9]{1,})',1,1,NULL,1) AS FRACTIONAL FROM DUAL;
结果:
FRACTIONAL
13
1 row selected.
SELECT REGEXP_SUBSTR('1.1 this is a test','^[0-9]{1,}[.]{1}([0-9]{1,})',1,1,NULL,1) AS FRACTIONAL FROM DUAL;
结果:
FRACTIONAL
1
1 row selected.
SELECT REGEXP_SUBSTR('99.99 this is a test','^[0-9]{1,}[.]{1}([0-9]{1,})',1,1,NULL,1) AS FRACTIONAL FROM DUAL;
结果:
FRACTIONAL
99
1 row selected.
答案 1 :(得分:1)
在这些任务上,我比regexp_replace
更喜欢regexp_substr
。
regexp_replace(str, '^.*?\.([[:digit:]]+).*$', '\1');
即从头开始查找wohle字符串,其中包含一些字符,一个点,一些数字,一些字符,直到结尾,但请记住仅数字并返回这些数字而不是字符串。
但是我想这只是个人喜好问题。
答案 2 :(得分:0)
select regexp_substr('12.13 this is a test', '\d+\.(\S+)', 1, 1, null, 1) rs
from dual;
RS
--
13