如何使一列不将 0 显示为十进制,而应显示零以外的小数



考虑一个同时包含十进制数和非十进制数的列

col1 
98
99.0
66.2 
99.6
76

预计在转换功能后

col1 
98
99
66.2 
99.6
76

我试图这样做

select cast(col1 as decimal)

使用regexp_replace(col1,'\.0+$','')--match . 字面意思和字符串末尾任意数量的零。

演示:

with mytable as (
select  
stack(5,'98',
'99.0',
'66.2',
'99.6',
'76') as col1 
)
select regexp_replace(col1,'\.0+$','') as col1 from mytable;

结果:

col1
98
99
66.2
99.6
76

但它会保持原样66.20值。如果您还想删除不重要的尾随零:66.20-->66.266.60200-->66.60266.0-->66并保留600原样,然后使用以下命令:

regexp_replace(regexp_replace(col1,'\.0+$',''),'(\d+\.\d+?)0+$','$1')

您可以使用case when来执行此操作。由于您喜欢的显示格式,生成的列将是字符串类型。

select 
case when round(col1, 0) = col1 
then cast(cast(round(col1, 0) as int) as string)
else cast(col1 as string)
end
from mytable

你试过浮点数据类型吗?

select cast(99.0 as float)

如果要控制格式,则需要转换为字符串。 这通常在应用程序级别完成。 但是您也可以在数据库中执行此操作:

select replace(printf(col1, '%.1f', col1), '.0', '')

这将使用两个小数位设置字符串的格式。 然后,它会删除'.0'(如果存在)。

最新更新