【问题标题】:convert hexadecimal to decimal in snowflake在雪花中将十六进制转换为十进制
【发布时间】:2021-09-03 05:45:16
【问题描述】:

我正在尝试将十六进制 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 转换为雪花中的十进制。 预期输出为340282366920938463463374607431768211455。 (它包含 39 位数字) 当我尝试使用如下所示的雪花 java 函数时,输出为指数格式。 问题是雪花数字数据类型支持38位。

create or replace function js_hextoint (s string) 
returns double language JAVASCRIPT 
 as 
 'if (S !== null)
 {
 output = parseInt(S, 16);
 }
 return output

输出是-3.40282366920938e+38

但预期的输出是340282366920938463463374607431768211455

我怎样才能得到预期的十进制转换?

【问题讨论】:

    标签: java hex snowflake-cloud-data-platform user-defined-functions


    【解决方案1】:

    费利佩·霍法非常乐于助人

    【讨论】:

    • 感谢您的评论。请接受答案,因为它解决了问题 - 这比添加额外的答案来表示感谢要好得多:)
    【解决方案2】:

    预期输出超出 Snowflake 中的数字范围:

    select 340282366920938463463374607431768211455;
    
    -- Error line 1 at position 7 Integer literal is out of representable range: 340282366920938463463374607431768211455
    

    如果您也在 Snowflake 之外使用纯 JavaScript 执行此操作,您会注意到您不会获得预期的输出。

    但是,如果您真的想获得完整表示的数字 - 您可以使用 Java UDF:

    create or replace function java_hextoint (s string) 
    returns string 
    language java 
    handler='MyClass.x'
    as $$
    import java.math.*;
    class MyClass {
      public static String x(String s) {
          return new BigInteger(s, 16).toString();
      }
    }
    $$;
    
    select java_hextoint('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF');
    

    【讨论】:

    • 非常感谢。它很有帮助。
    • 能否请您帮忙比较一下数字字符串。
    • 比较什么?开始一个新的 SO 问题有意义吗?
    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 2018-09-04
    • 2017-07-31
    • 2015-11-11
    相关资源
    最近更新 更多