0

我有一个关于在我有表格的列中标记字符串的问题

身份证清单
1我爱狗
2 我喜欢猫和狗  

等等

它应该转换为

身份证清单
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

正如我在评论中提到的,您可以尝试使用substrandinstr函数而不是regexp_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;

输出:

        身份令牌
---------- --------
         1 我       
         1 爱    
         1 条狗    
         2我       
         2 喜欢    
         2 只猫    
         2和     
         2 条狗    
         3 我       
         4 美国广播公司     
         5 美国广播公司     
         5 我
于 2013-11-09T19:20:19.610 回答