반응형
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
반응형
'source' 카테고리의 다른 글
SQL 서버에서 저장 프로시저의 예약된 실행 (0) | 2023.07.06 |
---|---|
의견요청 : 모든 테이블에 대해 하나의 시퀀스 (0) | 2023.07.06 |
괄호 문자가 포함된 SQL Server LIKE (0) | 2023.07.06 |
Firebase Cloud Messaging에서 푸시 알림을 생성하지 않고 정보를 가져옵니다. (0) | 2023.07.06 |
php facebook sdk는 워드프레스에서 사용자를 만들지 않습니다. (0) | 2023.07.06 |