【问题标题】:Truncating in Presto when zeroes appears after the decimal point当小数点后出现零时在 Presto 中截断
【发布时间】:2021-05-27 14:28:20
【问题描述】:

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

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

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

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

【问题讨论】:

  • 请提供样本数据和期望的结果。目前尚不清楚您要为给定数字显示什么。而如果小数点后有两位,为什么示例代码有6?

标签: sql type-conversion decimal presto truncate


【解决方案1】:

问题是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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2018-04-24
    • 1970-01-01
    相关资源
    最近更新 更多