मान लें कि आपकी तालिका का नाम 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
का उपनाम दिया है .
फिर मैंने इसे आपकी तालिका के साथ जोड़ दिया (क्वेरी में इसे अस्थायी कहा जाता है) और प्रत्येक रिकॉर्ड में घटनाओं की संख्या की गणना की।
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