多个十进制字符串转换为数字

时间:2013-08-08 15:30:35

标签: sql oracle

使用10g。

我有一个返回记录数值的regexp,但在某些情况下会返回多个小数点,例如68.70125195853.50

我需要的是只返回第一个小数后的两位小数的方法,如68.70。

我尝试过内置函数,如to_char,to_number和round。

我非常感谢你的帮助。

4 个答案:

答案 0 :(得分:1)

如果您只需要前两位小数,这应该可以使用。请注意,如果没有样本数据,答案可能会被取消;如果是这样,请提供您遇到问题的一些值的示例:

SELECT CAST(REGEXP_SUBSTR(myVal, '(\d+\.\d{0,2})|(\d+)') AS NUMBER(20, 2))
FROM myTable
WHERE REGEXP_LIKE(myVal, '(\d+\.\d{0,2})|(\d+)')

正则表达式应该没有小数位,以及一个或两个小数位。请注意,小数点后第二位的任何内容都将被截断,因此不会进行舍入。如果您想要舍入,请将\d{0,2}更改为\d+CAST将进行舍入。

WHERE子句忽略不包含数字的列,这可以防止出现错误。


附录:这是正则表达式的解释。它寻找两种模式中的一种。

第一种模式是(\d+\.\d{0,2})。这会使用小数位来捕获数字

  • ( ==>划分第一个模式,定义第一个模式的开头
  • \d+ ==>匹配一个或多个数字(\d表示“任何数字”)
  • \. ==>匹配一个句点(句点是一个“特殊”字符,所以要匹配它,你需要用斜杠(\
  • 来逃避它
  • \d{0,2} ==>匹配零,一个或两个数字
  • ) ==>分隔第一个模式,定义第一个模式的结束

第二种模式是(\d+)。它捕获数字,不带小数位。

  • ( ==>定义第二个模式的开头
  • \d+ ==>匹配一个或多个数字
  • ) ==>定义第二个模式的结尾

最后,这两个模式与OR运算符(|)结合在一起,因此如果任一模式匹配,您将获得匹配。

  • ( 第一模式 )|( 第二图案 )

模式的顺序在这里很重要,因为“带小数的数字”也匹配“无小数的数字”模式;这就是为什么“带小数的数字”模式是第一个。

答案 1 :(得分:0)

尝试:

 CAST(value AS Decimal(15,2))

如果您只关心数字的“外观”,可以使用:

SELECT TO_CHAR(num, '999,999,990.00')
  FROM MyTable

答案 2 :(得分:0)

这是一种方法:

select (case when val like '%.%'
             then cast(substr(t.val, 1, instr(val, '.')+2) as float)
             else cast(val as float)
        end)
from (select '68.70125195853.50' as val from dual) t;

case语句检查至少一个小数点。

答案 3 :(得分:0)

您可以在to_number

中使用以下正则表达式
to_number(
    regexp_substr(
        '68.70125195853.50',
        '^[0-9]+(\.[0-9]{1,2})?'
    )
)

单词:从一系列数字字符开始,最后是一个点,然后是1到2个数字字符。