Ошибка при использовании JSON_ARRAYAGG с выражением CASE: ORA-40590: invalid format

Использую Oracle 18c (воспроизводится и в 19c) и хотел бы применить стандартное SQL выражение CASE в агрегатной функции JSON_ARRAYAGG(), чтобы исключить значения из агрегации.

Однако это приводит к ошибке (на db<>fiddle):

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

ORA-40590: invalid format

Что вызывает эту ошибку? Это новый баг в Oracle?


Свободный перевод вопроса Oracle bug when using JSON_ARRAYAGG with CASE expression to emulate standard SQL FILTER от участника @Lukas Eder


Ответы (1 шт):

Автор решения: 0xdb

Это действительно баг, который был исправлен в 19.10
Прим.ред.: текущий долгосрочный релиз 19.03.

Надо добавить явно условия ELSE, это решит проблему:

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

Даст ожидаемый результат (на db<>fiddle):

[{"a":1}]

Свободный перевод ответа от участника @Lukas Eder

→ Ссылка