问题是truncate(x) → double 通过在小数点后去掉数字将x 舍入为整数,但它是double,而不是整数。并且显示没有非重要零的双精度是一项 GUI 工作,它显示所有这些或不显示非重要零。例如,当我使用 Presto Qubole 时,它不会显示 .000000,如果除了点后的 0 之外没有其他内容。所以问题可能出在您使用的工具上。
例如,这适用于 Qubole 上的 Presto:
with mydata as (
select 123.00000 as figure union all
select 123.0123 )
select case when regexp_like(cast(figure as varchar),'\d+\.0+$') then truncate(figure) else figure end
from mydata
结果:
123.0123
123
但在你的 GUI 中它可能不一样,因为在第二行不是整数,它是 decimal(8,5),包裹在 typeof() 函数中你会看到,GUI 决定如何显示 decimal(8,5)。
你说:
使用 varchar 将额外的零填充到右侧,因此是额外的
我在上面的表达式中使用的小数点后的零
不,您的表达式的结果不是 varchar,varchar 被隐式转换为十进制或双精度,请使用typeof() 进行检查。
如果您希望它不依赖于您使用的工具而工作,请转换为 varchar 并显式转换:
select case when regexp_like(cast(figure as varchar),'\d\.0+$') --all zeroes, change according to your requirements
then regexp_replace(cast(figure as varchar),'\.0+$','') --remove fractional part
else cast(figure as varchar) --we need same type in case
end as result
from mydata
这将保证工作,因为结果是 varchar 并按原样显示。
所有这些表达式都可以简化:
--remove .0+ if no 1-9 after dot:
select regexp_replace(cast(figure as varchar),'\.0+$','')
from mydata