sql - Oracle - 字符串组合排列

标签 sql oracle plsql oracle10g

我想我有一个复杂的要求。

这是使用 Oracle 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

最佳答案

编辑:得到了通用的。最后真的很简单(但我花了一段时间才到达那里)

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 内容。从以前的尝试遗留下来

关于sql - Oracle - 字符串组合排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6917027/

相关文章:

MySQL查询,从数据中得到前十名的结果,并统计它下面还剩多少

sql - 对于连接表中所有缺失的组合返回 0

xml - 您如何在 Oracle PL/SQL 中解析一个简单的 XML 片段并将其加载到全局临时表中?

oracle - systimestamp 和 sysdate 的奇怪行为

相当于 != 的 sql 运算符

C# linq 左连接

Oracle 11g 第 1 版与第 2 版 — LEFT OUTER JOIN 的不同行为

java - 嵌套异常是 org.hibernate.exception.SQLGrammarException : ORA-02289: sequence does not exist

java - 如何在 JDBC 批处理过程中获取失败的记录

oracle - PL SQL 中的 WHILE 循环有什么问题?