考虑一个同时包含十进制数和非十进制数的列
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.2
和66.60200
-->66.602
、66.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'
(如果存在)。