Snowflake 将 scientic 表示法转换为十进制输出

snowflake convert scientic notation to decimal output

提问人:Aiden 提问时间:11/10/2023 更新时间:11/10/2023 访问量:41

问:

嗨,有谁知道如何处理雪花中的科学记数法?

所以我得到了一列,带有 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

    输出“函数参数过多”错误

sql 类型转换 snowflake-cloud-data-platform

评论


答:

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);

enter image description here

因此,我猜测 value 是一种变体数据类型,因为它是来自表函数的 FLATTEN 集合的保留字,因此如下所示:

select *
from table(flatten(input=>parse_json('[0.0234, 9.6e-05]'))) as t;

enter image description here

果然,

select *
     ,to_varchar(value,'999.999999') as tvc
from table(flatten(input=>parse_json('[0.0234, 9.6e-05]'))) as t;

enter image description here

错误:函数 [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;

enter image description here

但是如果我们添加一个非浮点数据,比如"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;

enter image description here

评论

0赞 Aiden 11/10/2023
感谢您的回复!!它确实有效。但我仍然感到困惑,当您说变体数据类型时,您的意思是该列的数据类型是 VARCHAR?你能用简单的词来解释一下你在这里提到的关键词,FLATTEN系列吗?我仍然不明白为什么我会收到该错误消息。谢谢!!
0赞 Simeon Pilgrim 11/10/2023
如果您有 JSON、XML 或 ARRAY 数据,则通过 ARRAY_SPLIT 或 FLATTEN 检索的值的类型仅表示看起来像文本,而不是文本,因此它们必须转换为实际的 TEXT 类型,以便TO_DOUBLE可以解析它们。这有点令人费解,但出于历史原因,这种方式,雪花似乎总是有更重要的事情发展。VARIANT