我有一个像这样的模式的表
id name
1 jack
2 jack of eden
3 eden of uk
4 m of s
我想执行一个查询,它给出了像这样的单词
count word
2 jack
2 eden
3 of
这意味着杰克已经在这里2次,伊甸园2次,已经3次。
希望你有这个问题,我也试过但没有得到正确的查询或接近它
日Thnx
答案 0 :(得分:3)
假设您的表名为temp
(可能不是 - 将其更改为表格的正确名称)
我使用子查询来查找表中的所有单词:
select distinct regexp_substr(t.name, '[^ ]+',1,level) word , t.name, t.id
from temp t
connect by level <= regexp_count(t.name, ' ') + 1
此查询将拆分所有记录中的所有单词。我别名words
然后我用你的表(在查询中称为temp)加入它并计算每个记录中出现的次数。
select words.word, count(regexp_count(tt.name, words.word))
from(
select distinct regexp_substr(t.name, '[^ ]+',1,level) word , t.name, t.id
from temp t
connect by level <= regexp_count(t.name, ' ') + 1) words, temp tt
where words.id= tt.id
group by words.word
您还可以添加:
having count(regexp_count(tt.name, words.word)) > 1
更新:为了获得更好的性能,我们可以使用流水线功能的结果替换内部子查询:
首先,创建一个模式类型及其表格:
create or replace type t is object(word varchar2(100), pk number);
/
create or replace type t_tab as table of t;
/
然后创建函数:
create or replace function split_string(del in varchar2) return t_tab
pipelined is
word varchar2(4000);
str_t varchar2(4000) ;
v_del_i number;
iid number;
cursor c is
select * from temp; -- change to your table
begin
for r in c loop
str_t := r.name;
iid := r.id;
while str_t is not null loop
v_del_i := instr(str_t, del, 1, 1);
if v_del_i = 0 then
word := str_t;
str_t := '';
else
word := substr(str_t, 1, v_del_i - 1);
str_t := substr(str_t, v_del_i + 1);
end if;
pipe row(t(word, iid));
end loop;
end loop;
return;
end split_string;
现在查询应该如下:
select words.word, count(regexp_count(tt.name, words.word))
from(
select word, pk as id from table(split_string(' '))) words, temp tt
where words.id= tt.id
group by words.word