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