例如“ABC”是我的句子,我想更改所有变体中的单词位置。喜欢..
'A B C'
'A C B'
'B C A'
'B A C'
'C A B'
'C B A'
感谢你
问题有两个部分。
第一部分是将输入的句子拆分成单词。这是一个单独的问题,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
运算符 in约束的列是CONNECT BY
在分层查询中定义“循环”的列。该NOCYCLE
指令意味着我们不应该STR
在输出中有重复的值- 这正是我们想要的。由于我真的不需要任何条件STR
,我只是想和PRIOR
操作员一起,我写了一个微不足道的条件,PRIOR STR IS NOT NULL
. 所有的工作都是由分层查询完成的, with NOCYCLE
,当然还有 by SYS_CONNECT_BY_PATH
。的TRIM
是必要的,因为没有它的输出与一个空间(的结果开始SYS_CONNECT_BY_PATH
)。该WHERE
条款,使用CONNECT_BY_ISLEAF
, 是必需的,因为我们只想要完整的排列,我们也不需要单个单词和两个单词子集的排列。(只需将WHERE
子句放在外面看看它有什么作用。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句