Преобразование букв и цифр c в числа c и наоборот в oracle - PullRequest
0 голосов
/ 20 июня 2020

У меня есть требование преобразовать буквенно-цифровые c в числа c и наоборот.

Пример: Если передано 'A2', то я написал ниже запрос на преобразовать его в числа c:

select sum(val) from (
  select power(36, loc - 1) *
  case when letter between '0'
  and '9'
  then to_number(letter)
  else 10 + ascii(letter) - ascii('A')
  end as val from(
    select substr(ip_str, length(ip_str) + 1 - level, 1) letter,
    level loc from(select 'A2'
      ip_str from dual) connect by level <= length(ip_str)
  )
); --sum(val) returns 362

Как мне декодировать 362 обратно в 'A2'?

1 Ответ

1 голос
/ 21 июня 2020

Base N Convert - этот сайт описывает алгоритм. Я реализовал это как рекурсивный запрос:

with 
  t(num) as (select 362 from dual),
  r(md, div, lvl) as (
    select mod(num, 36), floor(num/36), 1 from t union all
    select mod(div, 36), floor(div/36), lvl + 1 from r where div > 0)
select listagg(case when md > 9 then chr(ascii('A') - 10 + md) 
                    else to_char(md) 
               end) within group (order by lvl desc) b36
  from r

dbfiddle demo

Кажется, работает, я протестировал несколько значений сравнение результатов с онлайн-калькуляторами. Теоретически можно использовать другие базы, не только 36, алгоритм такой же, но я не тестировал.

...