如何将二进制表示的数字转换为雪花数
Posted
技术标签:
【中文标题】如何将二进制表示的数字转换为雪花数【英文标题】:how to transform a number in binary representation to a Snowflake number 【发布时间】:2020-12-15 03:19:21 【问题描述】:我有一个二进制(base-2)表示的数字:
"10100110"
如何在 Snowflake 中将其转换为数字?
【问题讨论】:
这个二进制数据是从哪里来的?您是否将其加载到表格中? 是的,这个问题的输入是二进制形式的字符串(类似的问题:当字符串是十六进制形式时) docs.snowflake.com/en/user-guide/binary-input-output.html 等等,你在雪花公司工作? 是的,我在雪花公司工作。请注意,链接的文档指的是二进制数据,而不是二进制形式的数字“010101011110” 【参考方案1】:Snowflake 不提供开箱即用的数字或整数到二进制函数,但是可以使用这些 UDF 函数代替
如果字符串被传递,我还重载了 UDF。
CREATE OR REPLACE FUNCTION int_to_binary(NUM VARIANT)
RETURNS string
LANGUAGE javascript
AS $$
return (NUM >>> 0).toString(2);
$$;
CREATE OR REPLACE FUNCTION int_to_binary(NUM STRING)
RETURNS string
LANGUAGE JAVASCRIPT
AS $$
return (NUM >>> 0).toString(2);
$$;
【讨论】:
【参考方案2】:我尝试使用 SQL 纯 UDF - 起初它可以工作,但在将它与表上的数据一起使用时就不行了。
所以我不得不创建一个 Javascript UDF:
create or replace function bin_str_to_number(a string)
returns float
language javascript
as
$$
return parseInt(A, 2)
$$
;
select bin_str_to_number('110');
作为记录,这是我在尝试纯 SQL UDF 时遇到的错误:
SQL compilation error: Unsupported subquery type cannot be evaluated
UDF:
create or replace function bin_str_to_number(a string)
returns number
as
$$
(select sum(value::number*pow(2,index))::number
from table(flatten(input=>split_string_to_char(reverse(a)))))
$$
【讨论】:
OP 并不要求函数本身,因此select
表达式本身回答了这个问题。
SELECT 表达式有效,直到您尝试将其应用于来自表的数据,不幸的是【参考方案3】:
今天早上这是一个有趣的挑战!如果你想用纯 SQL 来做:
with binary_numbers as (
select column1 as binary_string
from (values('10100110'), ('101101101'), ('1010011010'), ('1011110')) tab
)
select
binary_string,
sum(to_number(tab.value) * pow(2, (tab.index - 1))) decimal_number
from
binary_numbers,
table(split_to_table(trim(replace(replace(reverse(binary_numbers.binary_string), '1', '1,'), '0', '0,' ), ','), ',')) tab
group by binary_string
生产:
BINARY_STRING | DECIMAL_NUMBER |
---|---|
10100110 | 166 |
101101101 | 365 |
1010011010 | 666 |
1011110 | 94 |
【讨论】:
以上是关于如何将二进制表示的数字转换为雪花数的主要内容,如果未能解决你的问题,请参考以下文章