Snowflake Javascript UDF:嵌套在作为科学记数法发出的对象中的十进制值

Snowflake Javascript UDFs: Decimal values nested within objects emitted as scientific notation

看起来 Snowflake UDF 在默认情况下使用科学记数法在对象类型(JSON 结构)中发出十进制值,即使这些值没有太多精度或很多有效数字。有没有办法阻止这种转换,或者有什么方法可以修改 UDF 以发出“更简单”的十进制值?

我希望保留对象结构,因此返回一个简单的十进制标量值不适合这个用例(换句话说,返回一些简单的值并调用 TO_DECIMAL() 或类似的格式选项会不是一个合适的解决方案——除非它有创造性的用途。

另外,对于这个用例,有必要传入整个对象,因为我正在对它执行一些递归处理,所以简单地通过 JSON 路径选择标量十进制值也不适合。

UDF 定义:

CREATE OR REPLACE FUNCTION F_DECIMAL(INPUT VARIANT)
RETURNS VARIANT
LANGUAGE javascript
AS
'
    return INPUT;
'

查询:

SELECT
    PARSE_JSON('{"a": 1234.56789012345678901234, "b": 2.0, "c": 3, "d": 1739210.5, "e": 1234.567}') AS json_parsed_simple,
    F_DECIMAL(PARSE_JSON('{"a": 1234.56789012345678901234, "b": 2.0, "c": 3, "d": 1739210.5, "e": 1234.567}')) AS json_udf

结果:

JSON_PARSED_SIMPLE JSON_UDF
{ "a": 1234.56789012345678901234, "b": 2, "c": 3, "d": 1739210.5, "e": 1234.567 } { "a": 1.234567890123457e+03, "b": 2, "c": 3, "d": 1.739210500000000e+06, "e": 1.234567000000000e+03 }

不能保证这将始终有效,但返回一个字符串化对象并在 SQL 中使用 ::object 转换回一个对象在这种情况下摆脱了科学记数法:

CREATE OR REPLACE FUNCTION F_DECIMAL(INPUT VARIANT)
RETURNS variant
LANGUAGE javascript
AS
'
    return JSON.stringify(INPUT);
';

SELECT
    PARSE_JSON('{"a": 1234.56789012345678901234, "b": 2.0, "c": 3, "d": 1739210.5, "e": 1234.567}') AS json_parsed_simple,
    F_DECIMAL(PARSE_JSON('{"a": 1234.56789012345678901234, "b": 2.0, "c": 3, "d": 1739210.5, "e": 1234.567}'))::object AS json_udf

Returns:

{
  "a": 1234.567890123457,
  "b": 2,
  "c": 3,
  "d": 1739210.5,
  "e": 1234.567
}