在 10g 上工作。
我有一个返回记录数值的正则表达式,但在某些情况下返回多个小数点,例如 68.70125195853.50
我需要的是一种只返回小数点后两位的方法,比如 68.70。
我尝试过内置函数,如 to_char、to_number 和 round。
非常感谢您的帮助。
如果您只需要前两位小数,这应该可以工作。请注意,如果没有样本数据,答案可能会被取消;如果是这样,请提供一些您遇到问题的值的示例:
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
运算符 ( |
) 连接,因此如果任一模式匹配,您将获得匹配。
(
第一种模式)|(
第二种模式)
模式的顺序在这里很重要,因为“带小数的数字”也匹配“不带小数的数字”模式;这就是为什么“带小数的数字”模式是第一位的。
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
您可能可以在 to_number 中使用以下正则表达式
to_number(
regexp_substr(
'68.70125195853.50',
'^[0-9]+(\.[0-9]{1,2})?'
)
)
用文字表示:以一系列数字字符开头,最后是一个点,然后是 1 到 2 个数字字符。
这是一种方法:
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
语句正在检查至少一位小数点。