Как отфильтровать элементы jsonb массива
Вроде бы распространённая задача, но решения не могу найти...
В хранимой функции в PostgreSQL есть массив в JSONB, нужно удалить из него элемент по значению.
Например, '[1,2,3,4,5]' нужно превратить в '[1,2,3,5]', т.е. удалить элемент со значением 4.
Вроде бы должно подойти выражение '$[*] ? (@ != 4)'::jsonpath
А для строк, возможно, и такое '$[*] ? (@ like_regex "^The")'
Но как его применить?
Если записать
SELECT '[1,2,3,4,5]'::jsonb @? '$[*] ? (@ != 4)'::jsonpath
То получаю true, а если так
SELECT '[1,2,3,4,5]'::jsonb @@ '$[*] ? (@ != 4)'::jsonpath
получаю null
Как получить новый jsonb-массив с отфильтрованными значениями?
PS Есть вариант решения через такую громоздкую конструкцию, но это из пушки по воробьям:
SELECT array_to_json(
array(
SELECT el FROM jsonb_array_elements('[1,2,3,4,5]') AS el WHERE el @? '$[*] ? (@ != 4)'
)
) AS result;