Uw oplossing kan nog wat vereenvoudigd worden:
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%';
Of nog eenvoudiger met jsonb_array_elements()
omdat je het rijtype niet echt nodig hebt (foo
) helemaal niet in dit voorbeeld:
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 hier
Maar dat is niet wat je vroeg precies:
U retourneert alle JSON-array-elementen (0-n per basistabelrij), waarbij één bepaalde sleutel ('{payload,details,*,name}'
) komt overeen (hoofdlettergevoelig).
En uw oorspronkelijke vraag had daarbovenop een geneste JSON-array. Je hebt de buitenste array voor deze oplossing verwijderd - ik deed hetzelfde.
Afhankelijk van uw werkelijke vereisten de nieuwe tekstzoekfunctie van Postgres 10 kan handig zijn.