2013-04-03 2 views
5

मैंने ओरेकल पीएल/एसक्यूएल को लीज करना शुरू किया और मैंने ओरेकल डाटाबेस 10 जी एक्सप्रेस को उसी उदाहरण और प्रश्नों के साथ डाउनलोड किया।ओरेकल पीएल/एसक्यूएल स्ट्रिंग स्वरूपण

एक प्रश्न है जिसे मैं हल नहीं कर सका।

प्रश्न है: सबसे पहले की सभी घटनाओं को दूर:

पहला नाम पुनः प्राप्त करने के एक SQL क्वेरी, अंतिम नाम, और प्रत्येक कर्मचारी के कोड जहां एक कर्मचारी की कोड इस प्रकार पाया जाता है लिखें पात्र "i" और "l", फिर, नाम के पहले छः अक्षरों, एक डैश चिह्न "-", और अंतिम नाम के अंतिम छः वर्णों को सम्मिलित करें जहां कोड के चरित्र केवल पहले और अंतिम अपरकेस होना चाहिए। यदि नाम में छः अक्षर नहीं हैं, तो अंडरस्कोर ("") को टुकड़े के अंत में रखें; यदि अंतिम नाम में छः अक्षर नहीं हैं, तो अंडरस्कोर ("") को टुकड़े की शुरुआत में रखें। नाम के अनुसार अंतिम नाम के अनुसार सूची का ऑर्डर करें, और ।

आउटपुट तरह

enter image description here

मैं कुछ लिखा होना चाहिए, लेकिन यह totaly गलत और स्पष्ट नहीं है। मुझे किन हिस्सों को ठीक करना चाहिए?


SELECT employees.first_name, employees.last_name, 
replace(replace(first_name,'l',''),'i'), 
initcap(substr(rpad(employees.first_name,6,'_'),1,6)) || '-' || 

case when length(employees.last_name)>4 
then lower(substr(employees.last_name,-5,4)) 
else lower(substr(lpad(employees.last_name,5,'_'),-5,4)) end || 
upper(substr(employees.last_name,-1,1)) code 

FROM employees 
ORDER BY last_name, first_name; 

यह मेरा निर्गम (गलत) है enter image description here

+0

'की जगह में (, की जगह (first_name, 'l' ''), 'मैं')' क्या आप ** ** के साथ की जगह "' मैं 'घ" कर रहे हैं वास्तव में? –

+0

असल में मैं इसे शून्य या "" के साथ प्रतिस्थापित करना चाहता हूं, लेकिन अगर मैं प्रतिस्थापन चरित्र जोड़ता हूं तो यह "पैरामीटर संख्या बहुत अधिक है" के बारे में त्रुटि दे रहा है – hakiko

+0

तो फिर क्यों नहीं? आपने खाली स्ट्रिंग के साथ "' l' "को क्यों बदल दिया है, लेकिन" i' "नहीं? –

उत्तर

3

आप इस तरह यह लिख सकते हैं:

select first_name, last_name, f 
     ||'-' 
     ||substr(l, 1, length(l) - 1) 
     ||upper(substr(l, -1)) code 
    from (select first_name, last_name, 
       initcap(rpad(substr(translate(first_name, 'xil', 'x'), 1, 6), 6, 
         '_')) f, 
       lpad(substr(translate(last_name, 'xil', 'x'), 
          greatest(-6, -length(translate(last_name, 'xil', 'x')))), 6, 
          '_') 
          l 
      from employees); 

मैं मान लिया गया है कि आप केवल i को बदलने के लिए करना चाहता था और l और I भी नहीं और L। इस मामले में अनुवाद replace(replace(str, 'l', ''), 'i', '') जैसा ही कार्य करेगा।

+0

लेकिन यह अपेक्षित आउटपुट नहीं दे रहा है। उदाहरण के लिए कॉलम नाम बहुत जटिल है। कॉलम नामों को उपरोक्त तस्वीर पसंद करना चाहिए :) – hakiko

+0

@ hakiko उदाहरण कोड भाग के लिए था। अन्य दो मूल कॉलम जोड़ने के लिए यहां देखें: http://sqlfiddle.com/#!4/1fba7/1 – DazzaL

+0

यह अच्छा समाधान है लेकिन मेरे पास पहले से ही डेटा, टेबल, कॉलम हैं। आपके लिंक में आपने इसे अपने सर्वश्रेष्ठ से बनाया है। :) मौजूदा डेटा के बारे में प्रश्न। ओरेकल एक्सप्रेस उदाहरण करने के लिए तैयार डेटाबेस देता है :) – hakiko

0

इस कोड है कि कुछ हद तक अपने मूल तर्क इस प्रकार है:

SELECT e."First_Name", e."Last_Name", 
     initcap(rpad(replace(replace(e."First_Name", 'l'), 'i'),6,'_')) 
     || '-' || 
     reverse(initcap(reverse(lpad(replace(replace(e."Last_Name", 'l'), 'i'),6,'_')))) "Code" 
FROM Employees e 
ORDER BY e."Last_Name", e."First_Name"; 

मैं REVERSE उपयोग कर रहा हूँ दो बार तो मैं रूप में अच्छी तरह अंतिम नाम के लिए INITCAP उपयोग कर सकते हैं। मैंने REPLACE के तीसरे पैरामीटर को भी छोड़ा क्योंकि फ़ंक्शन डिफ़ॉल्ट रूप से खाली स्ट्रिंग का उपयोग करता है।

यहां एक SQL Fiddle DEMO है जो मैं आपके डेटा के हिस्से से बना हूं। अधिक डेटा जोड़ने के लिए स्वतंत्र महसूस करें।

1

इस कोड को वास्तव में आपकी आवश्यकता इस प्रकार है: वांछित मूल्यों

साथ स्तंभ नाम और तालिका नाम बदलें

चयन Ename, नौकरी, INITCAP (RPAD (REPLACE (REPLACE (Ename, 'मैं'), 'मैं'), 6, '')) || '-' || LPAD ( रिवर्स ( INITCAP ( substr (रिवर्स ((REPLACE (REPLACE (नौकरी, 'मैं'), 'मैं'))), 1, 6))), 6, '') कोड नौकरी से रोजगार के क्रम से, Ename

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