Oracle
 sql >> база данни >  >> RDS >> Oracle

SQL заявка за получаване на броя на думите в таблицата

Ако приемем, че вашата таблица се казва 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. атомно сравняване и размяна в база данни

  2. Идентифицирайте дали съществува поне един ред с дадено условие

  3. SQL грешка:ORA-00907:проблем с липсваща дясна скоба

  4. Oracle SQL Query за обобщаване на статистика, използвайки GROUP BY

  5. Как да проверя версията на JDK в Oracle?