Search code examples
sqloraclebase36

Base 36 to Base 10 conversion using SQL only


A situation has arisen where I need to perform a base 36 to base 10 conversion, in the context of a SQL statement. There doesn't appear to be anything built into Oracle 9, or Oracle 10 to address this sort of thing. My Google-Fu, and AskTom suggest creating a pl/sql function to deal with the task. That is not an option for me at this point. I am looking for suggestions on an approach to take that might help me solve this issue.

To put this into a visual form...

WITH
Base36Values AS
(
    SELECT '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' myBase36 FROM DUAL
),
TestValues AS
(
    SELECT '01Z' BASE36_VALUE,
            71   BASE10_VALUE FROM DUAL
)
SELECT *
FROM Base36Values,
     TestValues

I am looking for something to calculate the value 71, based on the input 01Z. EDIT - that is backwards... given 01Z translate it to 71.

As a bribe, each useful answer gets a free upvote.

Thanks

Evil.


Solution

  • select sum(position_value) from
    (
      select power(36,position-1) * case when digit between '0' and '9' 
                                         then to_number(digit)
                                         else 10 + ascii(digit) - ascii('A')
                                    end
              as position_value
        from (
              select substr(input_string,length(input_string)+1-level,1) digit, 
                     level position
                from (select '01Z' input_string from dual)
                connect by level <= length(input_string)
             )
    )