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. 'ステートメントのsql'にパラメータを渡す方法は?

    2. SQLServer2017バックアップ-2

    3. MySQL:さまざまなレコードのデータを評価するクエリを作成することは可能ですか?

    4. MySQLは私のタイムスタンプ値を0000-00-00に変換しています