将base32转换为十进制数字

时间:2019-11-21 15:40:08

标签: sql oracle type-conversion decimal base32

有人可以帮助我将base32值转换为十进制数字吗? 我有一条sql语句,该语句返回一个base32值列表。例如,选择的返回看起来像这样:

5

8

H

13r

现在,我需要找出这些值中的哪个最高(在本例中为13r)。因此,我需要一个函数来将这些base32值转换为十进制数字,以便对其进行排序。 有人有这种功能吗?有人有不同的方法吗?

1 个答案:

答案 0 :(得分:0)

有点棘手。

您可以创建一个function,它将每个字符/数字与原始base32数字分开,并将其与32 ^(base32数字中的位置)相乘以获得十进制等效数字,并在其中使用function您的查询。

create function convert32todecimal(p_num in varchar2)
return number 
as
lv_outnum number;
begin
select sum(val) into lv_outnum from
(
  select power(32,pos) * case when d between '0' and '9' 
                then to_number(d)
                else 10 + ascii(d) - ascii('A')
           end as val
    from (
          select upper(substr(p_num,length(p_num)+1-level,1)) d,
                 level - 1 as pos
            from dual
            connect by level <= length(p_num)
         )
);
return lv_outnum;
end;
/

现在,按如下所示在查询中使用此功能:

with your_data(num) as (
select '5' from dual union all
select '8' from dual union all
select 'H' from dual union all
select '13r' from dual
)
select num, convert32todecimal(num)
from your_data
order by 2 desc;

db<>fiddle demo

干杯!