Oracle - комбинаторная перестановка строк

Я думаю, что у меня сложное требование.

Это требование комбинаторная перестановка с использованием Oracle 10.2, я смог решить ее, используя декартовы соединения, но я думаю, что необходимо внести некоторые улучшения, чтобы сделать ее более простой и гибкой.

Основное поведение.

входная строка : 'один два'

выход : 'один' 'два' 'один два' 'two one'

В моем решении я ограничил количество строк до 5 (обратите внимание, что на выходе получается число, близкое к факториалу)

SQL:

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
6
задан Sathyajith Bhat 3 August 2011 в 05:37
поделиться