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

regexp_substr literal max length limit in Oracle

我需要提取文本中以分号分隔的值。 我使用非常强大的 regexp_substr 但字符串有限制。我有时会有一个包含 10 000 个字符的文本,因此无法在此内置函数中使用此类字符串。

文本看起来像这样 - AU783 343; 3N9493;113 UN9 WE3 54; OI8343,; 43U.783.3

只有 0-9 和 A-Z ,如果有冒号或句点,则应将其删除。输出必须保持原样但没有前导和尾随空格

AU783 343
3N9493
113 UN9 WE3 54
OI8343
43U7833

有什么关于如何避免最大长度限制的建议吗?

您不需要使用正则表达式。简单的字符串函数 SUBSTRINSTRREPLACE 就足够了,并且可以使用 CLOB 值。

例如,给定 table:

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<>fiddle