【问题标题】:LISTAGG function: Short string return ORA-01489: result of string concatenation is too longLISTAGG 函数:短字符串返回 ORA-01489:字符串连接的结果太长
【发布时间】: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


【解决方案1】:

看起来DISTINCT 并没有达到你的预期。

首先选择所有不同的域,然后将listagg应用于结果。

简化:

select listagg(domain, ',') within group (order by domain) final_result  --> 2. aggregation
from 
     (select distinct regexp_substr(email_string, ...) as domain         --> 1. distinct domains
      from email_parameter
     )

【讨论】:

    猜你喜欢
    • 2013-01-29
    • 2017-02-06
    • 2016-05-28
    • 2013-04-04
    • 2011-08-13
    • 1970-01-01
    • 2015-06-28
    • 2012-05-12
    • 1970-01-01
    相关资源
    最近更新 更多