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
}
看起来 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
}