繁体   English   中英

将` LISTAGG` 转换为`XMLAGG`

[英]Convert ` LISTAGG` TO `XMLAGG`

如何将带有 case 语句的LISTAGG转换为等效的XMLAGG ,以免出现串联错误。

@ECHO ${cols_2 ||32767||varchar2}$ --Declare variable

SELECT LISTAGG( 'MAX(CASE WHEN CATEGORY = '''||CATEGORY||''' THEN "'||"LEVEL"||'" END) AS "'||"LEVEL"||'_'||CATEGORY||'"' , ',' )
          WITHIN GROUP( ORDER BY CATEGORY, "LEVEL" DESC )
    INTO cols_2
    FROM (
          SELECT DISTINCT "LEVEL", CATEGORY
            FROM temp
          );

我试过这个,但我收到一个错误,说missing keyword

@ECHO ${cols_2 ||32767||varchar2}$ --Declare variable

select rtrim (
          xmlagg (xmlelement (e, 'MAX(CASE WHEN CATEGORY = '''||CATEGORY||''' THEN "'||"LEVEL"||'" END) AS "'||LEVEL||'_'||CATEGORY||'"', ',') order by 1,2 desc).extract (
             '//text()'),
          ', ')
          INTO cols_2
    FROM (
          SELECT DISTINCT "LEVEL", CATEGORY
            temp
          );

我已经尝试过将 cols_2 声明为clob类型:-

SELECT DBMS_XMLGEN.CONVERT (
           RTRIM (
               XMLAGG (XMLELEMENT (
                           e,
                              'MAX(CASE WHEN CATEGORY = '''
                           || CATEGORY
                           || ''' THEN "'
                           || "LEVEL"
                           || '" END) AS "'
                           || "LEVEL"
                           || '_'
                           || CATEGORY
                           || '"',
                           ',')
                       ORDER BY 1, DESC).EXTRACT('//text()').getclobval(),','),1)
               ', '),
           1)
  INTO cols_2
  FROM (SELECT DISTINCT "LEVEL", CATEGORY
          FROM temp);

然而我的问题没有解决,我在尝试将它作为一个程序执行时出错:- 连接`LISTAGG`函数时出错[不是重复的问题]

您收到missing keyword错误是因为您很可能试图将第二个查询作为独立查询而不是在 PL/SQL 块中运行。 当你这样做时,你必须删除你的into cols_2子句。 这是您的直接问题,应该可以解决您的错误。

此外,根据您之前的问题,使用 XML 函数将转义您的'"字符,因此您需要确保将它们转回原始字符,以便您可以在动态 sql 查询中使用它们,如下所示:

SELECT DBMS_XMLGEN.CONVERT (
           RTRIM (
               XMLAGG (XMLELEMENT (
                           e,
                              'MAX(CASE WHEN CATEGORY = '''
                           || CATEGORY
                           || ''' THEN "'
                           || "LEVEL"
                           || '" END) AS "'
                           || "LEVEL"
                           || '_'
                           || CATEGORY
                           || '"',
                           ',')
                       ORDER BY 1, 2 DESC).EXTRACT ('//text()'),
               ', '),
           1)
  --INTO cols_2
  FROM (SELECT DISTINCT "LEVEL", CATEGORY
          FROM temp);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM