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

how to transform a number in binary representation to a Snowflake number

我有一个二进制(base-2)表示的数字:

"10100110"

如何在 Snowflake 中将其转换为数字?

我尝试使用 SQL 纯 UDF - 一开始它可以工作,但当它与 table 上的数据一起使用时就不行了。

所以我必须创建一个 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)))))
  $$

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);
      $$; 

今天早上这是一个有趣的挑战!如果你想用纯 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