如何将二进制表示的数字转换为雪花数

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

【讨论】:

以上是关于如何将二进制表示的数字转换为雪花数的主要内容,如果未能解决你的问题,请参考以下文章

将数字数组转换为二进制数

从整数转换为其二进制表示

P1143 进制转换

P1143 进制转换

如何在Java中将非常大的十进制数转换为二进制数

二进制数字怎么表示?