【问题标题】:how to transform a number in binary representation to a Snowflake number如何将二进制表示的数字转换为雪花数
【发布时间】:2020-12-15 03:19:21
【问题描述】:

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

"10100110"

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

【问题讨论】:

  • 这个二进制数据是从哪里来的?您是否将其加载到表格中?
  • 是的,这个问题的输入是二进制形式的字符串(类似的问题:当字符串是十六进制形式时)
  • 等等,你在雪花公司工作?
  • 是的,我在雪花公司工作。请注意,链接的文档指的是二进制数据,而不是二进制形式的数字“010101011110”

标签: sql binary user-defined-functions snowflake-cloud-data-platform


【解决方案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

    【讨论】:

      猜你喜欢
      • 2021-11-13
      • 1970-01-01
      • 2019-05-14
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 2012-11-19
      相关资源
      最近更新 更多