I’m using Oracle 18c (reproduces in 19c as well) and I’d like to emulate the standard SQL FILTER
clause in the JSON_ARRAYAGG()
aggregate function to filter out values from the aggregation. However, this produces an error:
x
select json_arrayagg(
case when t.a < 2 then json_object(key 'a' value t.a) end
)
from (
select 1 a
from dual
union all
select 2 a
from dual
) t
The error being:
ORA-40590: invalid format
dbfiddle here. What’s causing the error? Is it a bug in Oracle?
Advertisement
Answer
It does seem to be a bug, which has been fixed already in 19.10. Adding an explicit ELSE
clause seems to resolve the issue:
select json_arrayagg(
case
when t.a < 2 then json_object(key 'a' value t.a)
else null
end
)
from (
select 1 a
from dual
union all
select 2 a
from dual
) t
This now produces the expected result:
[{"a":1}]