删除小数点雪花后的尾随零
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
【讨论】:
以上是关于删除小数点雪花后的尾随零的主要内容,如果未能解决你的问题,请参考以下文章
使用 NSNumberFormatter 生成小数点后尾随零的数字