java - 如何使用可变长度字符串标记列

标签 java sql oracle plsql

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

id  list
1   i love dogs
2   i like cats and dogs  

and so on

it should be converted to

id  list
1   i
1   love
1   dogs
2   i
2   like
2   cates
2   and
2   dogs

How do I tokenize this? I tried using this code inside cursor and procedure

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

但是从 java 调用时速度非常慢。还有其他选择吗?

谢谢 安尼尔

最佳答案

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

输出:

        ID TOKEN 
---------- -------
         1 i       
         1 love    
         1 dogs    
         2 i       
         2 like    
         2 cats    
         2 and     
         2 dogs    
         3 i       
         4 abc     
         5 abc     
         5 i 

关于java - 如何使用可变长度字符串标记列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19881543/

相关文章:

mysql - sql : combining 2 query to give 1 resultset

sql - Oracle 中的强制可编辑 View

python - 巧妙缩进 SQL 语句的算法(Python 实现会很好)

sql - 找不到元素时,如何打印列值的 'NULL' 或 '0' 值?

sql - 从具有非唯一外键的表中选择 N 行

sql - Oracle 自动重命名 select 中的列?

java - JPA 仅使用其 ID 保存 "new"实体并引用现有实体?

java - Spring Data JPA Auditing 不适用于带有 @Modifying 注释的 JpaRepository 更新方法,为什么?

java增加数组维度

java - 字符串更改为 null