Vaše řešení lze ještě zjednodušit:
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%';
Nebo ještě jednodušší, s jsonb_array_elements()
protože ve skutečnosti nepotřebujete typ řádku (foo
) vůbec v tomto příkladu:
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 zde
Ale to ne na co jste se ptali přesně:
Vracíte všechny prvky pole JSON (0-n na řádek základní tabulky), kde je jeden konkrétní klíč ('{payload,details,*,name}'
) odpovídá (rozlišují se malá a velká písmena).
A vaše původní otázka měla navíc vnořené pole JSON. Pro toto řešení jste odstranili vnější pole - udělal jsem totéž.
V závislosti na vašich skutečných požadavcích možnost vyhledávání textu cap z Postgres 10 může být užitečné.