我试图截断一个在小数点后有 2 个数字的小数点,它应该在截断没有浮点值的数字时显示,并在小数点后有 1 到 9 的数字时显示带有浮点值的完整小数。我使用了以下查询,但它没有完成这项工作,但我仍然得到小数点后有零的数字。
select column1,case when right(cast(column1 as varchar),7)='.000000' then truncate(column1) else column1 end from table1;
使用 varchar 将额外的零填充到右侧,因此是我在上述表达式中小数点后使用的额外零
请让我知道只有在小数点为零作为浮点值时才截断小数点的方法
答案 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