由于这个问题,我们的网络项目已经崩溃了几次。网上的大多数答案建议使用xmlagg或clob,但仍然太麻烦了。 那么如何重写像wmconcat或listagg这样的函数,只显示前几个单词以避免问题,其余的单词将被省略号替换?
答案 0 :(得分:1)
另一种方法是,一旦长度接近4000个字符,就跳过连接。
首先,您需要在特定的ORDER之后找到要追加的列的长度的运行总和。按顺序查找最大行数,在它达到接近3500个字符(不包括最终字符串中的逗号)之前,您可以追加它们。
接下来,使用LISTAGG
使用相同的顺序连接字符串,限制在第一步中找到的行数。
WITH cte(maxrows)
AS (SELECT Max(rn)
FROM (SELECT row_number()
over (
ORDER BY rcol ) rn,
SUM(Length(rcol))
over (
ORDER BY rcol) total_length
FROM yourtable)
WHERE total_length < 3500),
ltd AS (SELECT *
FROM (SELECT rcol,
maxrows,
row_number()
over (
ORDER BY rcol ) rn
FROM yourtable
cross join cte)
WHERE rn <= maxrows)
SELECT LISTAGG(rcol, ',')
within GROUP ( ORDER BY rcol ) less_than_4000
FROM ltd;
注意:如果您在列中有重复的条目,建议您在上述处理开始之前设置DISTINCT
,假设您不需要多个连接中记录的值。