0

次のようなテーブルがある列の文字列のトークン化について質問があります

ID リスト
1 私は犬が大好きです
2 猫と犬が好き  

等々

に変換する必要があります

ID リスト
1 私
1 愛
1匹の犬
2 私
2いいね
2 ケイト
2 と
2匹の犬

これをトークン化するにはどうすればよいですか?カーソルとプロシージャ内でこのコードを使用してみました

SELECT id, regexp_substr(str, '[^ ]+', 1, level) TOKEN
    from test
CONNECT by level <= length(regexp_replace (str, '[^ ]+')) + 1;

しかし、これは Java から呼び出すと非常に遅くなります。他の代替手段はありますか?

ありがとうアニル

4

1 に答える 1

1

コメントで述べたように、 の代わりにsubstrand関数を使用してみてください。おそらく、パフォーマンスは許容できるでしょう。instrregexp_substr

CREATE TABLE test_list_tab (
  id NUMBER,
  str VARCHAR2(100)
);

CREATE TABLE test_tokens_tab (
  id NUMBER,
  token VARCHAR2(100)
);

INSERT INTO test_list_tab VALUES (1, 'i love dogs');
INSERT INTO test_list_tab VALUES (2, 'i like cats and dogs');
INSERT INTO test_list_tab VALUES (3, 'i');
INSERT INTO test_list_tab VALUES (4, 'abc');
INSERT INTO test_list_tab VALUES (5, 'abc i');
INSERT INTO test_list_tab VALUES (6, NULL);

DECLARE
  v_token test_list_tab.str%TYPE;
  v_space_position NUMBER := 1;
  v_prev_space_position NUMBER := 1;
BEGIN
  FOR v_rec IN (SELECT id, str FROM test_list_tab WHERE str IS NOT NULL)
  LOOP
    v_prev_space_position := 0;

    LOOP
      v_space_position := instr(v_rec.str, ' ', v_prev_space_position + 1);
      IF v_space_position > 0 THEN
        v_token := substr(v_rec.str, v_prev_space_position + 1, v_space_position - v_prev_space_position - 1);
      ELSE
        v_token := substr(v_rec.str, v_prev_space_position + 1);
      END IF;

      INSERT INTO test_tokens_tab VALUES (v_rec.id, v_token);

      v_prev_space_position := v_space_position;
      EXIT WHEN v_space_position = 0;
    END LOOP;
  END LOOP;

  COMMIT;
END;

SELECT id, token FROM test_tokens_tab;

出力:

        IDトークン
---------- -------
         1 私       
         1 愛    
         1匹の犬    
         2 私       
         2いいね    
         2匹の猫    
         2 と     
         2匹の犬    
         3 私       
         4 abc     
         5 abc     
         5 私
于 2013-11-09T19:20:19.610 に答える