5

この件に関しては同様の質問がたくさんありますが、最終結果がvarchar2には大きすぎるものを考慮した解決策を見つけることができません。

だから私がやろうとしているのは、これを変更することです:

Column1 | Column2
-------- --------
1         Hello
1         world,
1         please help
2         Thanks
2         world,
2         you're the best.

これに:

Column1 | Column2
-------- --------
1         Hello world, please help
2         Thanks world, you're the best.

私の特定の問題は、新しい連結値が 4000 文字を超える場合がいくつかあるため、LISTAGG期待どおりに使用できないことです。関数を書かなくても解決できることに特に興味がありますが、どちらでもかまいません。

4

3 に答える 3

2

de.hh.holger がすでに指摘しているように、LISTAGG WITH CLOB? STRING AGGREGATION EXCEEDING 4000 CHARACTERS WITH XMLAGGは実際にこの問題を解決します。

この件についてもう少し詳しく説明しましたが、これは非常に長い文字列メッセージの場合にうまくいくはずです:

SELECT
   table_row_id,
   DBMS_XMLGEN.CONVERT (
     EXTRACT(
       xmltype('<?xml version="1.0"?><document>' ||
               XMLAGG(
                 XMLTYPE('<V>' || DBMS_XMLGEN.CONVERT(data_value)|| '</V>')
                 order by myOrder).getclobval() || '</document>'),
               '/document/V/text()').getclobval(),1) AS data_value
FROM (
   SELECT 1 myOrder, 1 table_row_id,'abcdefg>' data_value FROM dual
   UNION ALL
   SELECT 2, 1 table_row_id,'hijklmn' data_value FROM dual
   UNION ALL
   SELECT 3, 1 table_row_id,'opqrst' data_value FROM dual
   UNION ALL
   SELECT 4, 1 table_row_id,'uvwxyz' data_value FROM dual)
GROUP BY
   table_row_id
于 2014-06-12T07:54:04.760 に答える
1
SELECT Column1 , LISTAGG(Column2, ' ') 
WITHIN GROUP (ORDER BY Column2) AS employees
FROM   Table1
GROUP BY Column1 ;

ぜひこちらの記事をご覧ください

于 2013-08-05T13:43:36.243 に答える