source

SQL만 사용하여 기본 36에서 기본 10으로 변환

ittop 2023. 7. 6. 22:34
반응형

SQL만 사용하여 기본 36에서 기본 10으로 변환

SQL 문에서 기본 36에서 기본 10으로 변환해야 하는 상황이 발생했습니다.Oracle 9 또는 Oracle 10에는 이러한 문제를 해결할 수 있는 기능이 없습니다.나의 Google-Fu와 AskTom은 작업을 처리하기 위해 pl/sql 함수를 만들 것을 제안합니다.그것은 현 시점에서 저에게 선택사항이 아닙니다.이 문제를 해결하는 데 도움이 될 수 있는 방법을 찾고 있습니다.

이걸 시각적인 형태로 표현하자면...

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

입력 01Z를 기준으로 71값을 계산할 것을 찾고 있습니다.편집 - 역방향입니다.01Z가 주어지면 71로 번역합니다.

뇌물로서, 각각의 유용한 답변은 무료 투표를 받습니다.

감사해요.

사악한.

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)
         )
)

T-SQL의 경우 다음 로직이 위의 Oracle 코드가 수행하는 작업을 수행합니다.이는 일반적인 일반 솔루션이며 Base-X에서 Base-10까지 지원합니다.

select
    sum(power(base,pos-1) *
            case when substring(cnv,pos,1) between '0' and '9' then 
                cast(substring(cnv,pos,1) as int) 
            else 10 + ascii(upper(substring(cnv,pos,1))) - ascii('A') end)
    from (values(reverse('01Z'), 36)) as t(cnv,base)
        left join (values(1),(2),(3),(4),(5),(6)) as x(pos)
            on pos <= len(cnv)

다른 베이스와 함께 사용하려면 다음을 사용합니다.

from (select cnv = reverse('FF'), base=16) as t

또는

from (select cnv = reverse('101'), base=2) as t

6보다 긴 문자열을 지원하려면 위치 벡터에 더 많은 값을 추가해야 합니다.

언급URL : https://stackoverflow.com/questions/2568668/base-36-to-base-10-conversion-using-sql-only

반응형