'A B C'
'A C B'
'B C A'
'B A C'
'C A B'
'C B A'
谢谢你
答案 0 :(得分:0)
问题分为两部分。
第一部分是将输入句分成单词。这是一个单独的问题,Stack Overflow上有许多线程(超过100个)显示了如何完成,我认为你的问题更多的是关于排列。
第二部分是,一旦你掌握了单词,你如何得到所有的排列。一种方法是使用分层查询,如原始帖子下的评论中所讨论的;然而,较旧的解决方案似乎过于复杂。以下是使用分层查询执行此操作的最简单方法:
with
test_data ( str ) as (
select 'alpha' from dual union all
select 'beta' from dual union all
select 'gamma' from dual
)
-- end of test data
select trim(sys_connect_by_path(str, ' ')) as perm
from test_data
where connect_by_isleaf = 1
connect by nocycle prior str is not null
;
PERM
----------------
alpha beta gamma
alpha gamma beta
beta alpha gamma
beta gamma alpha
gamma alpha beta
gamma beta alpha
我们遇到条件PRIOR STR IS NOT NULL
的唯一原因就是我们有STR
运算符出现PRIOR
的情况。 PRIOR
中CONNECT BY
运算符所在的列是在分层查询中定义“周期”的列。 NOCYCLE
指令意味着我们不应该在输出中重复STR
的值 - 这正是我们想要的。由于我STR
上并不需要任何条件,我只想用PRIOR
运算符,我写了一个简单的条件,PRIOR STR IS NOT NULL
。所有工作都是通过分层查询完成的,NOCYCLE
,当然还有SYS_CONNECT_BY_PATH
。需要TRIM
因为没有它,输出以空格开头(SYS_CONNECT_BY_PATH
的结果)。使用WHERE
的{{1}}子句是必需的,因为我们只需要完整的排列,我们也不需要单个单词和双字子集的排列。 (只需离开CONNECT_BY_ISLEAF
子句即可查看它的作用。)