Вашето решение може да бъде опростено още малко:
SELECT r.res->>'name' AS feature_name, d.name AS detail_name
FROM restaurants r
, jsonb_populate_recordset(null::foo, r.res #> '{payload, details}') d
WHERE d.name LIKE '%oh%';
Или по-просто, но с jsonb_array_elements()
тъй като всъщност не се нуждаете от типа ред (foo
) изобщо в този пример:
SELECT r.res->>'name' AS feature_name, d->>'name' AS detail_name
FROM restaurants r
, jsonb_array_elements(r.res #> '{payload, details}') d
WHERE d->>'name' LIKE '%oh%';
dbfiddle тук
Но това ене това, което попитахте точно:
Връщате всички елементи на JSON масив (0-n на ред на основна таблица), където един конкретен ключ ('{payload,details,*,name}'
) съвпада (чувствителен към регистър).
И вашият първоначален въпрос имаше вложен JSON масив върху това. Вие премахнахте външния масив за това решение - аз направих същото.
В зависимост от действителните ви изисквания новата възможност за търсене на текст на Postgres 10 може да е полезно.