Chỉ với một chút nỗ lực. Một cái gì đó như thế này:
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 ??;
Điều này tính toán độ dài đang chạy và chỉ tổng hợp các giá trị không vượt quá độ dài. ??
là bất cứ điều gì bạn đang sử dụng để tổng hợp. Điều này giả định rằng line
là duy nhất, vì vậy order by
ổn định.
Điều này sẽ không bao gồm impression
vượt quá độ dài - và không có gì sau đó. Nó không làm mất đi ấn tượng. Logic đó là có thể, nhưng nó làm phức tạp truy vấn.