当小数点后出现零时,在Presto中截断



我正在尝试截断一个小数点后有2个数字的小数,该小数点应在截断不带浮点值的数字时显示,而在小数点后还有1到9个数字时,该小数点将显示带浮动值的完整小数。我使用了下面的查询,但它不能完成任务,而且我仍然得到小数点后为零的数字。

select column1,case when right(cast(column1 as varchar),7)='.000000' then truncate(column1) else column1 end from table1;

使用varchar在右边加上额外的零,因此是我在上面的表达式中在小数点之后使用的额外的零

请让我知道只有当小数点有零作为浮动值时,才能截断小数点

问题是truncate(x) → double通过在小数点后丢弃数字来返回四舍五入到整数的x,但它是,而不是整数。显示没有非有效零的双精度是一项GUI作业,它显示所有的零或不显示非有效零。例如,当我使用Presto Qubole时,除了点后的0s之外,它不会显示000000。所以问题可能出在你们正在使用的工具上。

例如,这在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