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

时间:2021-05-27 14:28:20

标签: sql type-conversion decimal presto truncate

我试图截断一个在小数点后有 2 个数字的小数点,它应该在截断没有浮点值的数字时显示,并在小数点后有 1 到 9 的数字时显示带有浮点值的完整小数。我使用了以下查询,但它没有完成这项工作,但我仍然得到小数点后有零的数字。

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

使用 varchar 将额外的零填充到右侧,因此是我在上述表达式中小数点后使用的额外零

请让我知道只有在小数点为零作为浮点值时才截断小数点的方法

1 个答案:

答案 0 :(得分:0)

事情是 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 决定如何显示 { {1}}。

你说:

<块引用>

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

不,您的表达式的结果不是 varchar,varchar 被隐式​​转换为十进制或双精度,请使用 decimal(8,5) 检查。

如果您希望它不依赖于您使用的工具而工作,请转换为 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
相关问题