Я пытаюсь преобразовать следующий оператор pl/sql для использования в Superset/Trino:
select to_number(substr('D0023377B23DB783',-16), 'XXXXXXXXXXXXXXXX') from dual;
результат: 14988599054092911360
В trino/superset я использую следующий оператор, но он не возвращает правильный результат
select from_base(substr('D0023377B23DB783', 2), 16) ;
возврат: 619539137935235 Ожидаемый возврат: 14988599099026945923
Кто-нибудь может мне помочь?
Заранее спасибо, Ана
пожалуйста, sql выберите to_number(substr('D0023377B23DB783',-16), 'XXXXXXXXXXXXXXXX') из двойного;
результат: 14988599054092911360
суперсет/трино
выберите from_base(substr('D0023377B23DB783', 2), 16) ;
возврат: 619539137935235 Ожидаемый возврат: 14988599099026945923
Вы выбрасываете некоторые значимые цифры, поэтому ваш расчет становится недействительным. В идеале вы должны иметь возможность преобразовать число следующим образом:
select from_base('D0023377B23DB783', 16) ;
Но поскольку from_base
возвращает BIGINT
, это число слишком велико (см. Престо не может прочитать шестнадцатеричную строку: недопустимое число по основанию 16). Один из трюков — переключиться на DECIMAL
и разобрать число по частям. Что-то вроде следующего может дать вам представление:
select from_base('D0', 16) * cast(power(16, 14) as decimal)
+ from_base('023377B23DB783', 16);
Выход:
_col0
----------------------
14988599099026945923
@AnaPinheiroTorres, ты можешь посчитать и разобрать по частям, см. обновление.
Большое спасибо за Ваш ответ! Но выдает ошибку: ошибка трино: недопустимое число по основанию 16: D0023377B23DB783 Я искал обходной путь и не нашел его. Я нашел это, объясняющее почему: stackoverflow.com/questions/69946854/ … Знаете ли вы, есть ли способ получить большее число?