복붙노트

[SQL] 자료 10 변환을 사용하여 SQL 만에 자료 (36)

SQL

자료 10 변환을 사용하여 SQL 만에 자료 (36)

나는 SQL 문의 맥락에서, 기본 10 변환에베이스 (36)를 수행 할 필요가 어디 상황이 생겨났다. 이런 종류의를 해결하기 위해 오라클 9, 오라클 (10)에 내장 아무것도있을 나타나지 않습니다. 내 구글 - 푸 및 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

I는 입력 01Z에 따라 값 (71)을 계산하는 뭔가를 찾고 있어요. 편집 - 뒤로 ... 01Z이 71로 번역 제공됩니다.

뇌물, 각 유용한 답변은 무료 upvote에 가져옵니다.

감사

악.

해결법

  1. ==============================

    1.

    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)
             )
    )
    
  2. ==============================

    2.T-SQL은 다음 로직은 오라클 위의 코드는 수행하는 작업을 수행합니다. 이것은 일반적인 일반적인 솔루션과 자료-10 BASE-X를 지원합니다 :

    T-SQL은 다음 로직은 오라클 위의 코드는 수행하는 작업을 수행합니다. 이것은 일반적인 일반적인 솔루션과 자료-10 BASE-X를 지원합니다 :

    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 이상 지원 문자열이 위치 벡터에 더 많은 값을 추가해야합니다.

  3. from https://stackoverflow.com/questions/2568668/base-36-to-base-10-conversion-using-sql-only by cc-by-sa and MIT license