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

时间:2016-07-15 11:54:32

标签: sql string oracle sorting 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';

我使用此代替LISTAGG(column_name,','),因为结果将超出varchar2(> 4000)的限制。 现在我问自己是否有可能像LISTAGG那样对结果进行排序。

所以当有列FERA,BAUT,CHECK_ID,......我希望它们能像以下一样返回:BAUT,CHECK_ID,FERA,......

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

2 个答案:

答案 0 :(得分:8)

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'

答案 1 :(得分: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 );