2011-09-08 44 views
4

我從表中選擇記錄並將結果作爲單行CSV列表返回。
我正在使用Oracle 10 release 2。這裏是我的查詢:輸出大CSV行的字符串聚合溢出`replace`

SELECT column1,rtrim 
      (replace 
       (replace 
        (xmlagg(xmlelement("x", column2)).getclobval(), 
         '<x>', 
         NULL), 
       '</x>', 
       ','), 
      ',') 
FROM table1 
group by column1; 

我的問題是,當字符串大於4000字符它失敗,因爲替換功能。我可以通過刪除替換函數並使用我的編程語言中的函數來解決此問題。
我想修改查詢,以便我可以指定CSV列表中每行返回多少個元素。因此,例如,使用上述查詢將返回包含CSV列表中10000個元素的行(不包括替換函數)。
修改的查詢將返回10行1000個元素(10行可以修改)。 例如原來查詢將返回:

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

修訂後的查詢會是這樣的

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

我不能使用collect功能,但什麼都應該是不錯的,只是SQL如果可能的話

回答

1

您可以使用分析函數將行分配給任意存儲桶,然後按組進行分組。

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; 

的參數設置NTILE桶的數量,所以您可以根據需要改變它。

要設置固定數量的值而不是固定數量的桶,我認爲你可以用TRUNC(((ROW_NUMBER() OVER (PARTITION BY column1 ORDER BY column2)) - 1) /1000)替換NTILE表達式,其中1000是每個桶的值數。

+0

感謝以上這是非常好的,如果我想指定查詢返回的每行元素的數量而不是行數,我將如何去解決這個問題,所以它會返回任意數量的行,每行元素(再次10將是可以修改的)。感謝 – ward

+0

感謝戴夫以上的添加到查詢也適用。這很棒 – ward