2010-04-02 9 views
13

एक स्थिति उत्पन्न हुई है जहां मुझे SQL कथन के संदर्भ में आधार 10 रूपांतरण के लिए आधार 36 करने की आवश्यकता है। इस तरह की चीज को हल करने के लिए ओरेकल 9, या ओरेकल 10 में निर्मित कुछ भी नहीं दिखता है। मेरा Google-Fu, और AskTom कार्य से निपटने के लिए एक pl/sql फ़ंक्शन बनाने का सुझाव देता है। यह इस बिंदु पर मेरे लिए एक विकल्प नहीं है। मैं इस मुद्दे को हल करने में मेरी सहायता करने के लिए एक दृष्टिकोण पर सुझाव ढूंढ रहा हूं।SQL 36 का उपयोग कर बेस 10 से बेस 10 रूपांतरण केवल

एक दृश्य के रूप में डाल करने के लिए ...

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

मैं कुछ मूल्य 71, इनपुट 01Z के आधार पर गणना करने के लिए देख रहा हूँ। संपादित करें - यह पीछे की तरफ है ... दिया गया 01Z इसे 71 तक अनुवादित करता है।

रिश्वत के रूप में, प्रत्येक उपयोगी उत्तर को मुफ्त अपवॉट मिलता है।

धन्यवाद

ईविल।

+1

मैं सिर्फ उत्सुक हूं (मैं हमेशा डेटा स्टोर करने के लिए अलग-अलग आधारों का उपयोग करने का बहाना ढूंढना चाहता हूं); आधार 36 डेटा के लिए क्या उपयोग किया जाता है? –

+1

और मुझे उत्सुकता है कि इसे एसक्यूएल में क्यों किया जाना है, यह वास्तव में आम नहीं है। –

+3

आधार 36 का लाभ यह है कि आप एक एम्बेडेड डिवाइस का उपयोग कर सकते हैं जिसमें इनपुट प्रदान करने के लिए सीमित कीबोर्ड है। फिर, स्ट्रिंग के रूप में इसे बेस 36 के रूप में व्याख्या करना आकार के कारण अधिक कुशल है और इसके अलावा आप डिफ़ॉल्ट कार्यों का उपयोग करके इसके साथ गणना कर सकते हैं। – Henri

उत्तर

22
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) 
     ) 
) 
+0

+1, saweeeeeet! स्तर वाक्यविन्यास द्वारा कनेक्ट के उपयोग के उत्कृष्ट चित्रण। – DCookie

+0

हां। केस स्टेटमेंट द्वारा बेस 36 स्ट्रिंग को बदलें। धन्यवाद डेव। – EvilTeach

2

टी-एसक्यूएल के लिए निम्नलिखित तर्क उस कार्य को निष्पादित करेगा जो उपरोक्त ओरेकल कोड करता है। यह सामान्य सामान्य समाधान है और बेस-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 से अधिक तारों को आपको स्थिति वेक्टर में अधिक मूल्य जोड़ने की आवश्यकता होगी।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^