Twoje rozwiązanie można jeszcze bardziej uprościć:
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%';
Lub jeszcze prościej, używając jsonb_array_elements()
ponieważ tak naprawdę nie potrzebujesz typu wiersza (foo
) w ogóle w tym przykładzie:
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 tutaj
Ale to nie o co prosiłeś dokładnie:
Zwracasz wszystkie elementy tablicy JSON (0-n na wiersz tabeli bazowej), gdzie jeden konkretny klucz ('{payload,details,*,name}'
) pasuje (z uwzględnieniem wielkości liter).
Twoje oryginalne pytanie zawierało zagnieżdżoną tablicę JSON. Usunąłeś zewnętrzną tablicę dla tego rozwiązania — ja zrobiłem to samo.
W zależności od aktualnych wymagań nowa funkcja wyszukiwania tekstowego Postgresa 10 może się przydać.