如何改变句子中所有变体的单词位置

时间:2017-05-11 14:00:29

标签: sql oracle plsql oracle11g

例如' A B C'是我的句子,我想改变所有变体中的单词位置。像..

'A B C'
'A C B'
'B C A'
'B A C'
'C A B'
'C B A'

谢谢你

1 个答案:

答案 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的情况。 PRIORCONNECT 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子句即可查看它的作用。)