Sql 字符串聚合输出大CSV行溢出`replace`

Sql 字符串聚合输出大CSV行溢出`replace`,sql,string,oracle,Sql,String,Oracle,我正在从表中选择记录,并将结果作为单行CSV列表返回。 我正在使用Oracle 10第2版。我的问题是: SELECT column1,rtrim (replace (replace (xmlagg(xmlelement("x", column2)).getclobval(), '<x>', NULL

我正在从表中选择记录,并将结果作为单行CSV列表返回。
我正在使用Oracle 10第2版。我的问题是:

SELECT column1,rtrim
           (replace
                (replace
                     (xmlagg(xmlelement("x", column2)).getclobval(), 
                      '<x>',
                      NULL),
                 '</x>',
                 ','),
            ',')
FROM table1
group by column1;
修改后的查询类似于

1234,1234,1234,1234,  
1234,5678,3456,12344,  
654677

我不能使用
collect
函数,但其他任何功能都应该是好的,如果可能的话,只使用SQL即可

您可以使用分析函数将行分配给任意存储桶,并据此进行分组

SELECT column1,rtrim
           (replace
                (replace
                     (xmlagg(xmlelement("x", column2)).getclobval(), 
                      '<x>',
                      NULL),
                 '</x>',
                 ','),
            ',')
FROM (SELECT column1, column2, NTILE(10) OVER (PARTITION BY column1 ORDER BY column2) bucket)
group by column1,bucket;
选择第1列,rtrim
(替换
(替换
(xmlagg(xmlement(“x”,column2)).getclobval(),
'',
空),
'',
','),
',')
FROM(选择column1、column2、NTILE(10)OVER(按column1分区按column2排序)bucket)
按第1列分组,bucket;
NTILE的参数设置存储桶的数量,因此您可以根据需要对其进行更改


要为每个bucket设置固定数量的值,而不是固定数量的bucket,我认为可以用
TRUNC(((ROW_number()OVER(PARTITION BY column1 ORDER BY column2))-1)/1000)替换NTILE表达式,其中1000是每个bucket的值的数量。

感谢上面的内容,这很好,如果我想指定查询将返回的每行元素的数量而不是行的数量,那么我该怎么做呢?这样,除了每行10个元素之外,它将返回任意数量的行(同样,这10个元素是可以修改的)。ThanksHanks Dave上述对查询的添加也起作用。这太棒了
SELECT column1,rtrim
           (replace
                (replace
                     (xmlagg(xmlelement("x", column2)).getclobval(), 
                      '<x>',
                      NULL),
                 '</x>',
                 ','),
            ',')
FROM (SELECT column1, column2, NTILE(10) OVER (PARTITION BY column1 ORDER BY column2) bucket)
group by column1,bucket;