Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Truy vấn SQL để tính số từ trong bảng

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nó chính xác là gì một BLOB trong ngữ cảnh DBMS

  2. Chuỗi kết nối Oracle ODP.NET:Điều gì xảy ra trong Nguồn dữ liệu?

  3. Chia chuỗi thành hàng Oracle SQL

  4. Cách thêm máy chủ quản lý trong R12.2

  5. Nhận tên tháng kể từ ngày trong Oracle