这是一个使用Oracle 10.2的组合排列,我能够使用笛卡尔连接来解决它,但我认为它需要一些改进才能使它变得最简单和更灵活。
主要行为。
输入字符串: '一两个'
输出: '一' '二' '二合一' '两个一'
对于我的解决方案我已经限制字符串的数量为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
2011-08-02
Metl
+2
是否必须在SQL中,或者您还可以使用plsql? –
+1
你打算有固定数量的字符串元素吗?因为如果它可以改变,那么我不明白你如何避免去做PL/SQL路线。您对“灵活”一词的使用表明这就是您的想法。 –
+0
是的,它可以使用plsql完成。 –