如何在雪花中实现 NUMBER(Oracle) 数据类型功能?

Posted

技术标签:

【中文标题】如何在雪花中实现 NUMBER(Oracle) 数据类型功能?【英文标题】:How to achieve NUMBER(Oralce) data type functionality in snowflake? 【发布时间】:2020-03-06 06:25:59 【问题描述】:

我有一个像 4.138 这样的 oracle 表列值 153.2809 128.113141081389 尝试使用表 DDL NUMBER(38,16) 将这些值加载到雪花中。所以现在雪花表中的值变为 4.1380000000000000 153.2809000000000000 128.1131410813890000 但我需要在 oracle 中将这些值加载到雪花中,而不是尾随 0。 如何做到这一点?

【问题讨论】:

您确定这是存储问题而不仅仅是显示问题吗?您可能可以在显示它们时对其进行格式化。 你的意思是显示问题。您是否有任何教程可以在列级别格式化以显示给用户? 这是一个存储问题。我试图从雪花中提取数据,它的尾随为 0。4.1380000000000000153.2809000000000000 如何提取它们?我不知道 Snowflake 但the formatting docs 说“通常,整数部分的前导零和小数部分的尾随零被替换为空格”所以这必须是可能的,并且应该是默认值。 【参考方案1】:

格式化固定位置的数字类型,使其不显示尾随零:

create or replace table TEST_NUMBERS (N number(38,16));
insert into TEST_NUMBERS(N) values (4.138), (153.2809), (128.113141081389);

select to_varchar(N, 'FMTM') as COMPACT_NUMBER from TEST_NUMBERS;

-- The "FM" toggles the "Fill Mode" to compact from the default, which is full.
-- The "TM" specifies using "Text Minimal".
-- It requires both Fill Mode of compact and Text Minimal set to suppress trailing
-- zeros on fixed-position numbers.

这当然只是为了显示和输出。如果您想了解规模和精度如何影响存储和计算,请参阅文档的这一部分:

https://docs.snowflake.net/manuals/sql-reference/data-types-numeric.html#impact-of-precision-and-scale-on-storage-size

【讨论】:

【参考方案2】:

好吧,一般来说,如果您想存储没有尾随零的数据,您应该按比例缩小。 NUMBER(38,3) 将存储 4.138,仅此而已。

如果是出于显示目的,则只需根据https://docs.snowflake.net/manuals/sql-reference/sql-format-models.html#fixed-position-numeric-formats更改格式化字符串

【讨论】:

但我的要求是十进制数字会因记录而异:153.2809。所以我定义了 NUMBER(38,16)。那么 Snowflake NUMBER 数据类型不会像 Oracle NUMBER 数据类型那样工作? 它的工作原理完全相同。甲骨文也用同样的比例保存,只是显示的问题。如果您解释一下您的用例到底是什么,我们可能会提供更好的帮助。 十进制值在小数部分有占位符零。您可以强制转换为浮动以消除零。您可以转换为文本以绕过您的工具可能正在应用的格式。例如,select 1.23456789::number(38,16)::float::text, 1.23456789::number(38,16)::text; 我不会那样做......由于缺乏精度,强制转换为浮动实际上可以改变值。

以上是关于如何在雪花中实现 NUMBER(Oracle) 数据类型功能?的主要内容,如果未能解决你的问题,请参考以下文章

oracle中minus中有负数

如何找到雪花中的总连接数

如何将二进制表示的数字转换为雪花数

如何比较雪花中的数字字符串

带有 ORDER BY 的雪花 JSON 扁平化

使用雪花中的合并将值插入表并根据条件删除行