删除小数点雪花后的尾随零

Posted

技术标签:

【中文标题】删除小数点雪花后的尾随零【英文标题】:Removing trailing zeroes after decimal Snowflake 【发布时间】:2021-12-01 11:24:52 【问题描述】:

我一直在尝试从小数点后的数字列中删除尾随零。例如:

0.978219150000 -> 0.97821915
0.650502591918 -> 0.650502591918
0.975479450000 -> 0.97547945

数据类型为 NUMBER(38,12)。有没有办法像我上面提到的那样删除尾随零?

【问题讨论】:

【参考方案1】:

如果这只是一个格式/显示问题,您可以使用带有固定十进制格式字符串的 to_varchar() 函数:

select 123.45::number(38,12); -- 123.450000000000
select to_varchar(123.45::number(38,12), '99G999G999G999G999G999G999G999G999D999999999999'); -- 123.45

由于格式字符串有点长,将其放在 UDF 中以使其在 SQL 中更紧凑可能是有意义的:

create or replace function DISPLAY_38_12(N number(38,12))
returns varchar
language sql
as
$$
to_varchar(123.45::number(38,12), '99G999G999G999G999G999G999G999G999D999999999999')
$$;

select DISPLAY_38_12(123.45::number(38,12));

【讨论】:

【参考方案2】:

您可以尝试强制转换为浮动:

create or replace table test (a NUMBER(38,12));
insert into test values (0.97821915), (0.650502591918), (0.975479450000);

select a from test;
+----------------+
|              A |
|----------------|
| 0.978219150000 |
| 0.650502591918 |
| 0.975479450000 |
+----------------+

select a::float from test;
+--------------+
|     A::FLOAT |
|--------------|
| 0.97821915   |
| 0.6505025919 |
| 0.97547945   |
+--------------+

但是,根据您想要实现的目标,由于潜在的舍入问题,使用浮点数可能不是一个好主意。

更新:

我尝试了正则表达式版本,不确定我是否错过了任何测试用例:

create or replace table test (a NUMBER(38,12));
insert into test values 
    (0.97), 
    (0.650502591918), 
    (0.975479450000), 
    (10000), 
    (1450000), 
    (12.2000), 
    (14.0200);

select regexp_replace(
    a::varchar, 
    '^([0-9]+)$|' ||
    '^([0-9]+)\.0*$|' ||
    '^([0-9]+\.[0-9]1,[1-9])0*$|' ||
    '^([0-9]+\.[1-9])0*$', '\\1\\2\\3\\4'
) as a from test;

+----------------+
| A              |
|----------------|
| 0.97           |
| 0.650502591918 |
| 0.97547945     |
| 10000          |
| 1450000        |
| 12.2           |
| 14.02          |
+----------------+

地点:

^([0-9]+)$                   -> will cover the integer like 10000
^([0-9]+)\.0*$               -> will cover integer like 10.000000
^([0-9]+\.[0-9]1,[1-9])0*$ -> will cover 14.0200000
^([0-9]+\.[1-9])0*$.         -> will cover 12.20000 or 0.97540000

【讨论】:

以上是关于删除小数点雪花后的尾随零的主要内容,如果未能解决你的问题,请参考以下文章

带逗号的 Oracle 格式数字删除尾随零小数

删除前导零和尾随零并将结果保留到小数点后两位

从Excel中删除尾随零并将小数点添加到字符串

使用 NSNumberFormatter 生成小数点后尾随零的数字

如何在 WebApi IActionResult Ok() 函数中删除可空小数的尾随零?

如何从 Pandas 日期时间索引中删除尾随零(根据需要格式化)?