【发布时间】:2021-07-04 22:22:33
【问题描述】:
我有一个查询要从使用多个电子邮件地址维护的列中提取电子邮件域。列值为aaa@yahoo.com、bbb@hotmail.com,列大小为VARCHAR2(3500 CHAR)
以下查询使用 listagg 函数提取域并以正则表达式为前缀:
SELECT DISTINCT
LISTAGG( CHR(91)||'a-zA-Z0-9._%-'||CHR(93)||'+' ||REGEXP_SUBSTR(EMAIL_STRING,'@' || CHR(91) || '^,'
|| CHR(93) ||'+', 1, LEVEL), ',')
WITHIN GROUP (ORDER BY LEVEL) AS USER_EMAILS_DOMAIN
FROM EMAIL_PARAMETER WHERE NAME='UserEmails'
CONNECT BY REGEXP_SUBSTR(EMAIL_STRING,'@'||CHR(91)||'^,'||CHR(93)||'+', 1, LEVEL) IS NOT NULL;
预期结果:[a-zA-Z0-9.%-]+@yahoo.com,[a-zA-Z0-9.%-]+@hotmail.com
字符串在 4000 个字符以内,但是 Oracle 返回 ORA-01489: result of string concatenation is too long
我尝试使用LISTAGG 和ON OVERFLOW TRUNCATE选项,它返回一个长字符串和第二封电子邮件,bbb@hotmail.com 不断重复。
我还尝试了XMLTAGG,而且我收到了一个很长的字符串,两封电子邮件都在重复。
select rtrim(xmlagg(xmlelement(e,CHR(91)||'a-zA-Z0-9._%-'||CHR(93)||'+' || EMAIL_STRING,',').extract('//text()') order by REGEXP_SUBSTR(EMAIL_STRING,'@' || CHR(91) || '^,' || CHR(93) ||'+', 1, LEVEL)).getclobval(),',') USER_EMAILS_DOMAIN
FROM EMAIL_PARAMETER WHERE NAME='UserEmails'
CONNECT BY REGEXP_SUBSTR(EMAIL_STRING,'@'||CHR(91)||'^,'||CHR(93)||'+', 1, LEVEL) IS NOT NULL;
【问题讨论】:
-
您好,请提供一些测试数据
-
@ekochergin,我提到了有问题的数据。 email_string 列值为 aaa@yahoo.com, bbb@hotmail.com
标签: regex overflow oracle12c listagg