Seulement avec un peu d'effort. Quelque chose comme ça :
select listagg((case when running_len < 4000 then oi.impression end), ',') within group (order by oi.line)
from (select oi.*,
sum(length(oi.impression) + 1) over (partition by ?? order by oi.line) as running_len
from order_impression oi
) oi
group by ??;
Cela calcule la longueur courante et agrège uniquement les valeurs qui ne dépassent pas la longueur. Le ??
est tout ce que vous utilisez pour l'agrégation. Cela suppose que line
est unique, donc le order by
est stable.
Cela n'inclura pas l'impression
qui dépasse la longueur - et rien après cela. Il ne coupe pas l'impression. Cette logique est possible, mais elle complique la requête.