使用10g。
我有一个返回记录数值的regexp,但在某些情况下会返回多个小数点,例如68.70125195853.50
我需要的是只返回第一个小数后的两位小数的方法,如68.70。
我尝试过内置函数,如to_char,to_number和round。
我非常感谢你的帮助。
答案 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个数字字符。