Oracle - комбинаторная перестановка строк - PullRequest
6 голосов
/ 02 августа 2011

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

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

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

строка ввода : «один два»

выход : «один», «два», одинtwo '' 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

1 Ответ

9 голосов
/ 03 августа 2011

Редактировать: Получил общий.В конце концов, очень просто (но мне потребовалось некоторое время, чтобы туда добраться)Осталось от предыдущих попыток

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...