regexp_substr文字在Oracle中的最大长度限制



我需要提取文本中用分号分隔的值。我使用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

有什么建议可以避免最大长度限制吗?

您不需要使用正则表达式。简单的字符串函数SUBSTRINSTRREPLACE是足够的并且与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,例如使用非常大的琴弦。

最新更新