Hanya dengan sedikit usaha. Sesuatu seperti ini:
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 ??;
Ini menghitung panjang berjalan dan hanya nilai agregat yang tidak melebihi panjang. ??
adalah apa pun yang Anda gunakan untuk agregasi. Ini mengasumsikan bahwa line
unik, jadi order by
stabil.
Ini tidak akan menyertakan impression
yang melebihi panjangnya -- dan tidak ada setelah itu. Itu tidak memotong kesan. Logika itu mungkin, tetapi itu memperumit kueri.