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
有什么关于如何避免最大长度限制的建议吗?
您不需要使用正则表达式。简单的字符串函数 SUBSTR
、INSTR
和 REPLACE
就足够了,并且可以使用 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。
我需要提取文本中以分号分隔的值。 我使用非常强大的 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
有什么关于如何避免最大长度限制的建议吗?
您不需要使用正则表达式。简单的字符串函数 SUBSTR
、INSTR
和 REPLACE
就足够了,并且可以使用 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。