我需要提取文本中用分号分隔的值。我使用regexp_substr,它非常强大,但字符串有限制。我有时有一个包含10000个字符的文本,所以不可能在这个内置函数中使用这样的字符串。
文本看起来是这样的-AU78343;3N9493;113 UN9 WE3 54;OI8343;43U.783.3
只有0-9和A-Z,如果有冒号或句点,则应将其删除。输出必须保持原样,但没有前导和尾随空格
AU783 343
3N9493
113 UN9 WE3 54
OI8343
43U7833
有什么建议可以避免最大长度限制吗?
您不需要使用正则表达式。简单的字符串函数SUBSTR
、INSTR
和REPLACE
是足够的并且与CLOB
值一起工作。
例如,给定表格:
CREATE TABLE table_name (
id NUMBER
GENERATED ALWAYS AS IDENTITY
PRIMARY KEY,
value CLOB
);
您可以使用提取所有子字符串
WITH bounds (id, value, s_pos, e_pos) AS (
SELECT id,
value,
1,
INSTR(value, ';', 1)
FROM table_name
UNION ALL
SELECT id,
value,
e_pos + 1,
INSTR(value, ';', e_pos + 1)
FROM bounds
WHERE e_pos > 0
)
SEARCH DEPTH FIRST BY id SET id_order
SELECT id,
REPLACE(
REPLACE(
CASE e_pos
WHEN 0
THEN SUBSTR(value, s_pos)
ELSE SUBSTR(value, s_pos, e_pos - s_pos)
END,
':'
),
'.'
) AS value
FROM bounds;
请参阅db<gt;fiddle,例如使用非常大的琴弦。