如何在snowflake中将散列字符串转换为整数?

s2j5cfk0  于 2021-07-27  发布在  Java
关注(0)|答案(3)|浏览(433)

我试图得到一个十进制值的散列并将其转换为整数。但是查询会导致以下错误: Numeric value 'b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda' is not recognized ```
SELECT (CAST(sha2(TO_VARCHAR(ABS(12.5)), 256) AS INTEGER) % 100) AS temp_value

在snowflake中,将哈希字符串转换为整数的正确方法是什么?我不能使用任何用户定义的函数。而且必须配合雪花的原生功能。
nmpmafwu

nmpmafwu1#

哈希值包含字母字符,因此会引发错误

SELECT --(CAST(
sha2(
TO_VARCHAR(
  ABS(12.5)), 256)-- AS INTEGER) % 100) 
  AS temp_value;
5w9g7ksd

5w9g7ksd2#

您需要将哈希编码中的十六进制值转换为int。
我还没有找到一个内置在snowflake中的函数可以实现这一点,但是如果您查看以下链接,它将解释如何创建javascript函数来为您进行转换:https://snowflakecommunity.force.com/s/article/faq-does-snowflake-have-a-hex-to-int-type-function
如果使用链接中的函数,则代码会变成这样:

SELECT (CAST(js_hextoint(sha2(TO_VARCHAR(ABS(12.5)), 256)) AS INTEGER) % 100) AS temp_value

我恐怕无法测试上面的代码,所以可能有一个括号放错了地方。。。

lyfkaqu1

lyfkaqu13#

你有一个56位的十六进制数。它不符合38的最大数字精度。您可以使用浮点数,但这将失去精度。

create or replace function CONV(VALUE_IN string, OLD_BASE float, NEW_BASE float)
returns string
language javascript
as
$$
    // Usage note: Loses precision for very large inputs
    return parseInt(VALUE_IN, Math.floor(OLD_BASE).toString(Math.floor(NEW_BASE)));
$$;

select conv('b902cc4550838229a710bfec4c38cbc7eb11082367a409df9135e7f007a96bda', 16, 10);

--Returns 8.368282050700398e+76

相关问题