从xmlagg(xmlelement(...)中排序结果

Ben*_* C. 4 sql sorting string oracle oracle11g

我有这个SQL查询:

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

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

因此,当列FERA,BAUT,CHECK_ID,...我希望它们返回为:BAUT,CHECK_ID,FERA,...

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

Hus*_*vik 9

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'
Run Code Online (Sandbox Code Playgroud)


小智 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 );
Run Code Online (Sandbox Code Playgroud)