У меня есть число в двоичном (base-2) представлении:
"10100110"
Как я могу преобразовать его в число в Snowflake?
да, входные данные для этой задачи приходят в виде строк в двоичной форме (аналогичная проблема: когда строки приходят в шестнадцатеричной форме)
Подожди, ты работаешь в Снежинке?
Да, я работаю в Снежинке. Обратите внимание, что связанные документы относятся к двоичным данным, а не к числам в двоичной форме «010101011110».
Я пробовал с чистым 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)))))
$$
ОП не запрашивает функцию как таковую, поэтому само выражение select
отвечает на вопрос.
Выражение SELECT работает, пока вы не попытаетесь применить его к данным, поступающим из таблицы, к сожалению.
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
Производит:
откуда берутся эти бинарные данные? Вы загружаете его в таблицу?