【问题标题】:Convert LISTAGG to XMLAGG Oracle将 LISTAGG 转换为 XMLAGG Oracle
【发布时间】:2018-05-23 04:22:42
【问题描述】:

我有一个下面的 SQL,我正在尝试将 LISTAGG 转换为 XMLAGG。我的数据库版本是 12.1,因此 LISTAGG 不支持超过 4K 的字符。

原始查询:--

SELECT LISTAGG (se1.EMAIL, ', ')
WITHIN GROUP (ORDER BY se1.EMAIL)
AS listofsgs
FROM abc se1, xyz team , mno sne
                WHERE     team.employee_id = se1.employee_id
                      AND sne.non_employee_id = team.non_employee_id

转换后的查询:--

SELECT XMLAGG(XMLELEMENT(se1.EMAIL||',')).EXTRACT('//text()')  
WITHIN GROUP (ORDER BY se1.EMAIL)
AS listofsgs
FROM abc se1, xyz team , mno sne
   WHERE     team.employee_id = se1.employee_id
   AND sne.non_employee_id = team.non_employee_id

但是每当我运行它时,它总是会因为缺少逗号的语法错误而失败。我转换后的查询是正确的还是我做错了?

【问题讨论】:

    标签: sql oracle listagg string-aggregation


    【解决方案1】:

    试试下面的查询替换LISTAGG

    SELECT RTRIM (
              XMLAGG (XMLELEMENT (e, se1.email || ',') ORDER BY se1.email).EXTRACT (
                 '//text()'),
              ',')
              listofsgs
      FROM abc se1, xyz team, mno sne
     WHERE     team.employee_id = se1.employee_id
           AND sne.non_employee_id = team.non_employee_id
    

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,下面为我工作:

      Select RTRIM((XMLAGG(XMLELEMENT(e, se1.EMAIL || ',') ORDER BY se1.EMAIL).EXTRACT ('//text()')).getclobval(),',') listofsgs
      FROM abc se1, xyz team , mno sne
         WHERE     team.employee_id = se1.employee_id
         AND sne.non_employee_id = team.non_employee_id
      

      请注意:我添加 getclobval() 是因为我收到“ORA-19011:字符串缓冲区太小错误”。如果不需要,可以将其删除。

      【讨论】:

        【解决方案3】:

        试试这个查询:

        SELECT XMLAGG(XMLELEMENT(e,se1.EMAIL||',')).EXTRACT('//text()', ',')
            WITHIN GROUP (ORDER BY se1.EMAIL)
            AS listofsgs
            FROM abc se1, xyz team , mno sne
               WHERE     team.employee_id = se1.employee_id
               AND sne.non_employee_id = team.non_employee_id;
        

        【讨论】:

        • 在 Group 中说 From keyword not found 失败。
        • 尝试 SELECT by SELECT RTRIM(XMLAGG(XMLELEMENT(e,se1.EMAIL||',')).EXTRACT('//text()'), ',') AS listofsgs FROM abc se1, xyz 团队, mno sne WHERE team.employee_id = se1.employee_id AND sne.non_employee_id = team.non_employee_id;
        • 添加了 RTRIM 并评论说 WITHIN GROUP (ORDER BY se1.EMAIL) 对我有用...选择应该是 SELECT RTRIM(XMLAGG(XMLELEMENT(e,se1.EMAIL||',') ).EXTRACT('//text()'), ',') AS listofsgs
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-05
        • 1970-01-01
        • 1970-01-01
        • 2021-06-04
        • 1970-01-01
        • 2021-11-01
        • 1970-01-01
        相关资源
        最近更新 更多