2011-08-02 15 views
6

मुझे लगता है कि मेरे पास जटिल आवश्यकता है।ओरेकल - स्ट्रिंग संयोजक क्रमपरिवर्तन

यह ओरेकल 10.2 का उपयोग करके एक संयोजी क्रमपरिवर्तन है, मैं इसे कार्टशियन जोड़ों का उपयोग करके हल करने में सक्षम हूं, लेकिन मुझे लगता है कि इसे सरल और अधिक लचीला बनाने के लिए कुछ सुधारों की आवश्यकता है।

मुख्य व्यवहार।

इनपुट स्ट्रिंग: 'एक दो'

उत्पादन: 'एक' 'दो' 'एक दो' 'दो एक'

मेरे समाधान के लिए मैं पर पाबंदी लगा रखी स्ट्रिंग्स की संख्या 5 (ध्यान दें कि आउटपुट फैक्टरियल के पास एक संख्या है)

एसक्यूएल:

with My_Input_String as (select 1 as str_id, 'alpha beta omega gama' as str from dual) 

--------logic------- 

, String_Parse as (
        SELECT REGEXP_SUBSTR(str, '[^ ]+', 1, ROWNUM) str 
        FROM My_Input_String 
        where rownum < 6 -- string limitation -- 
        CONNECT BY level <= LENGTH(REGEXP_REPLACE(str, '([^ ])+|.', '\1')) 
       )  

--------CRAP select need refactoring------- 

select str from String_Parse 
union 
select REGEXP_REPLACE(trim(s1.str||' '||s2.str||' '||s3.str||' '||s4.str||' '||s5.str), '(){2,}', ' ') as str 
from 

(select str from String_Parse union select ' ' from dual) s1, 
(select str from String_Parse union select ' ' from dual) s2, 
(select str from String_Parse union select ' ' from dual) s3, 
(select str from String_Parse union select ' ' from dual) s4, 
(select str from String_Parse union select '  ' from dual) s5 
where 
-- 
s1.str <> s2.str and s1.str <> s3.str and s1.str <> s4.str and s1.str <> s5.str 
-- 
and s2.str <> s3.str and s2.str <> s4.str and s2.str <> s5.str 
-- 
and s3.str <> s4.str and s3.str <> s5.str 
-- 
and s4.str <> s5.str 
+2

क्या इसे एसक्यूएल में होना है या आप plsql का भी उपयोग कर सकते हैं? – Rene

+1

क्या आपके पास स्ट्रिंग तत्वों की एक निश्चित संख्या होगी? क्योंकि अगर यह भिन्न हो सकता है, तो मुझे नहीं लगता कि आप पीएल/एसक्यूएल रूट करने से कैसे बच सकते हैं। "लचीला" शब्द का उपयोग यह बताता है कि आप क्या सोच रहे हैं। – APC

+0

हाँ, यह plsql का उपयोग करके किया जा सकता है। स्ट्रिंग तत्वों की संख्या के संबंध में – Metl

उत्तर

8

संपादित करें: जेनेरिक एक मिला। अंत में वास्तव में सरल है (लेकिन मुझे वहाँ पहुँचने के लिए कुछ समय लिया)

WITH words AS 
( SELECT REGEXP_SUBSTR('&txt', '\S+', 1, LEVEL) AS word 
     , LEVEL          AS num 
    FROM DUAL 
    CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE('&txt', '\S+\s*', 'X')) 
) 
SELECT SYS_CONNECT_BY_PATH(W.word, ' ') 
FROM words W 
CONNECT BY NOCYCLE PRIOR W.num != W.num 

EDIT2: निकाला गया अनावश्यक maxnum सामान। पिछले प्रयासों से बाएं

+0

महान समाधान, बस मुझे जो चाहिए! – Metl

+0

वास्तव में अच्छा विचार है – josephj1989

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