Giả sử bảng của bạn được đặt tên là temp
(có thể là không - hãy đổi nó thành tên phù hợp của bảng của bạn)
Tôi đã sử dụng một truy vấn con để tìm tất cả các từ trong bảng của bạn:
select distinct regexp_substr(t.name, '[^ ]+',1,level) word , t.name, t.id
from temp t
connect by level <= regexp_count(t.name, ' ') + 1
truy vấn này tách tất cả các từ khỏi tất cả các bản ghi. Tôi đã đặt bí danh cho nó là words
.
Sau đó, tôi kết hợp nó với bảng của bạn (trong truy vấn, nó được gọi là tạm thời) và đếm số lần xuất hiện trong mỗi bản ghi.
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
Bạn cũng có thể thêm:
having count(regexp_count(tt.name, words.word)) > 1
cập nhật :để có hiệu suất tốt hơn, chúng ta có thể thay thế truy vấn con bên trong bằng các kết quả của một hàm pipelined:
trước tiên, hãy tạo một kiểu lược đồ và một bảng của nó:
create or replace type t is object(word varchar2(100), pk number);
/
create or replace type t_tab as table of t;
/
sau đó tạo hàm:
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;
bây giờ truy vấn sẽ giống như sau:
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