Limit listagg function to first 4000 characters [duplicate] Limit listagg function to first 4000 characters [duplicate] oracle oracle

Limit listagg function to first 4000 characters [duplicate]


12.2 and above

The ON OVERFLOW option makes is easy to handle more than 4000 characters:

select listagg(product_name, ',' on overflow truncate) within group (order by product_name)from products;

11.2 to 12.1

An analytic function can generate a running total length of the string aggregation. Then an inline view can remove any values where the length is greater than 4000.

In a real query you may need to add a partition by to the analytic functions, to only count per some group.

--The first 4000 characters of PRODUCT_NAME.select    --Save a little space for a ' ...' to imply that there is more data not shown.    case when max(total_length) > 3996 then        listagg(product_name, ', ') within group (order by product_name)||            ' ...'    else        listagg(product_name, ', ') within group (order by product_name)    end product_namesfrom(    --Get names and count lengths.    select        product_name,        --Add 2 for delimiters.        sum(length(product_name) + 2) over (order by product_name) running_length,        sum(length(product_name) + 2) over () total_length    from products    order by product_name)where running_length <= 3996

Here's a SQL Fiddle demonstrating the query.