0

在 10g 上工作。

我有一个返回记录数值的正则表达式,但在某些情况下返回多个小数点,例如 68.70125195853.50

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

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

非常感谢您的帮助。

4

4 回答 4

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运算符 ( |) 连接,因此如果任一模式匹配,您将获得匹配。

  • (第一种模式)|(第二种模式)

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

于 2013-08-08T15:50:24.737 回答
0

Try:

 CAST(value AS Decimal(15,2))

If you're just concerned with the "look" of the numbers, you can use:

SELECT TO_CHAR(num, '999,999,990.00')
  FROM MyTable
于 2013-08-08T15:40:52.463 回答
0

您可能可以在 to_number 中使用以下正则表达式

to_number(
    regexp_substr(
        '68.70125195853.50',
        '^[0-9]+(\.[0-9]{1,2})?'
    )
)

用文字表示:以一系列数字字符开头,最后是一个点,然后是 1 到 2 个数字字符。

于 2013-08-09T17:03:41.687 回答
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语句正在检查至少一位小数点。

于 2013-08-08T15:44:40.980 回答