提问人:Aiden 提问时间:11/10/2023 更新时间:11/10/2023 访问量:41
Snowflake 将 scientic 表示法转换为十进制输出
snowflake convert scientic notation to decimal output
问:
嗨,有谁知道如何处理雪花中的科学记数法?
所以我得到了一列,带有 FLOAT dataType 的 VALUE,我得到了 9.6e-05 和 0.0234 这样的值
我想用逗号替换小数点,然后与其他列连接作为我的最终结果
当我单独使用硬代码值转换它时,它工作正常,但是当我在那里使用列名时,它会弹出“函数参数太多”问题
select 'Value:'||replace(to_varchar(9.6e-05,'999.999999'),'.',',') as Result
输出值:0,000096
select 'Value:'||replace(to_varchar(0.0234,'999.999999'),'.',',') as Result
输出值:0,0234
select 'Value:'||replace(to_varchar(VALUE,'999.999999'),'.',',') as Result From src
输出“函数参数过多”错误
答:
2赞
Simeon Pilgrim
11/10/2023
#1
我不确定如何重现您的错误,因为所描述的问题似乎有效:
select value
,to_varchar(value,'999.999999') as tvc
,'Value:'||replace(to_varchar(VALUE,'999.999999'),'.',',') as Result
from values
(0.0234::float),
(9.6e-05::float)
as t(value);
因此,我猜测 value 是一种变体数据类型,因为它是来自表函数的 FLATTEN 集合的保留字,因此如下所示:
select *
from table(flatten(input=>parse_json('[0.0234, 9.6e-05]'))) as t;
果然,
select *
,to_varchar(value,'999.999999') as tvc
from table(flatten(input=>parse_json('[0.0234, 9.6e-05]'))) as t;
错误:函数 [TO_VARCHAR(T.VALUE, '999.999999')] 的参数过多,预期为 1,得到 2(第 10 行)
因此,如果我们首先将变体转换为浮点:
select value
,to_varchar(value::float,'999.999999') as tvc
from table(flatten(input=>parse_json('[0.0234, 9.6e-05]'))) as t;
但是如果我们添加一个非浮点数据,比如"not float"
select value
,to_varchar(value::float,'999.999999') as tvc
from table(flatten(input=>parse_json('[0.0234, 9.6e-05, "not float"]'))) as t;
我们得到:
无法将变体值“not float”转换为 REAL
所以我们需要使用 TRY_TO_DOUBLE 函数来处理失败,但是:
select value
,to_varchar(try_to_double(value),'999.999999') as tvc
from table(flatten(input=>parse_json('[0.0234, 9.6e-05, "not float"]'))) as t;
函数 TRY_CAST 不能与 VARIANT 和 FLOAT 类型的参数一起使用
因此,我们需要将变体数据转换为 TEXT,以便 TRY_TO_DOUBLE 可以处理它,并在文本值上优雅地生成 null。
select value
,to_varchar(try_to_double(value::text),'999.999999') as tvc
from table(flatten(input=>parse_json('[0.0234, 9.6e-05, "not float"]'))) as t;
评论
0赞
Aiden
11/10/2023
感谢您的回复!!它确实有效。但我仍然感到困惑,当您说变体数据类型时,您的意思是该列的数据类型是 VARCHAR?你能用简单的词来解释一下你在这里提到的关键词,FLATTEN系列吗?我仍然不明白为什么我会收到该错误消息。谢谢!!
0赞
Simeon Pilgrim
11/10/2023
如果您有 JSON、XML 或 ARRAY 数据,则通过 ARRAY_SPLIT 或 FLATTEN 检索的值的类型仅表示看起来像文本,而不是文本,因此它们必须转换为实际的 TEXT 类型,以便TO_DOUBLE可以解析它们。这有点令人费解,但出于历史原因,这种方式,雪花似乎总是有更重要的事情发展。VARIANT
评论