【问题标题】:Sort result from xmlagg(xmlelement(...)从 xmlagg(xmlelement(...) 排序结果
【发布时间】:2016-11-18 15:04:43
【问题描述】:

我得到了这个 SQL 查询:

        select rtrim(extract(xmlagg(xmlelement(e, column_name || ',')),
       '/E/text()').getclobval(), ',') from all_tab_columns
        where OWNER = 'TESTER' AND TABLE_NAME = 'H4_POSIT';

我使用它而不是 LISTAGG(column_name, ',') 因为结果将超过 varchar2 (>4000) 的限制。 现在我问自己是否可以像 LISTAGG 那样对结果进行排序。

所以当有列 FERA、BAUT、CHECK_ID、...时,我希望它们返回为:BAUT、CHECK_ID、FERA、...

我正在使用 Oracle Server,但我的框架不允许我使用 PL/SQL。

【问题讨论】:

    标签: sql string oracle sorting oracle11g


    【解决方案1】:

    XMLAGG 支持自行排序(见https://docs.oracle.com/database/121/SQLRF/functions251.htm):

    SELECT
        rtrim(
            extract(
                xmlagg(
                    xmlelement(e, column_name || ',') ORDER BY column_name
                ),
            '/E/text()')
            .getclobval (),
        ',')
    FROM
        all_tab_columns
    WHERE
        owner = 'TESTER' AND table_name = 'H4_POSIT'
    

    【讨论】:

    • 感谢您的选择。
    【解决方案2】:

    您可以使用子查询并在将列传递给 xml 函数之前简单地对列进行排序。一个简单的解决方案。

     select rtrim(extract(xmlagg(xmlelement(e, column_name || ',')),
    '/E/text()').getclobval(), ',') from 
    (select * from  all_tab_columns
     where OWNER != 'TESTER' AND TABLE_NAME=upper('H4_POSIT')       
     order by COLUMN_NAME );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-18
      • 2016-06-29
      • 2019-04-09
      • 1970-01-01
      • 2010-11-03
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多