我得到了一个名为'sentence'的唯一列的表
Create Table Test(
sentence VARCHAR2(100);
);
和
Insert into Test('this is a message');
基本上我想要实现的是获取空格之后和之前的所有子字符串。但是,我执行的查询只占用空格
之前的子字符串SELECT (Regexp_substr (sentence, '^[^ ]+ ')) sentence_new
FROM Test
GROUP BY sentence;
我想要的结果是
RESULT
---------------------
This
is
a
test
This is
This a
This test
is test
is this
is a
a This
a is
a test
Test this
test a
test is
This is a
This is test
This a test
a is this
a test this
a this is
is this a
is test a
is this test
test a this
test is this
test this is
答案 0 :(得分:0)
问题分为两部分。
第一部分是创建一个视图(查询结果),它将包含四个单词,每个空格分隔。你已经能够做到这一点。 编辑:实际上,在重新阅读时,你不是。见下文(本答复的底部)。
第二部分是获得所有"组合" 1,2,3或4个不同字,由空格分隔。对于数学正确性,您可能还应该将空字符串包含为0个单词的组合,但这可以单独解决。
一种方法是使用分层查询。这是一个例子,它将产生来自集合{1,2,3,4}的1,2,3或4个不同值的所有组合。注意结果也会有一个领先的空间;您可以使用ltrim()
将其删除。我没有显示输出,因为它是64行,但您可以在数据库上运行它。
with
inputs ( n ) as (
select 1 from dual union all
select 2 from dual union all
select 3 from dual union all
select 4 from dual
)
-- end of test data; SQL query begins below this line
select sys_connect_by_path(n, ' ') as result
from inputs
connect by nocycle prior n > 0
;
根据您的练习进行调整 - 而不是inputs
您应该从第一个查询的结果中选择(将句子拆分为单个单词),而不是n
您应该使用该列您在那里创建的别名(sentence_new
)。
修改 - 我重新阅读了您的帖子,发现您无法将该句子拆分为所有组成单词。这是通过另一个分层查询完成的。这有多复杂取决于输入中只有一行,还是很多。如果您只有一行,那就很简单:
SELECT (Regexp_substr (sentence, '[^ ]+ ', 1, level)) sentence_new
FROM Test
connect by level <= 1 + regexp_count(sentence, ' +')