Din løsning kan forenkles noget mere:
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%';
Eller endnu enklere med jsonb_array_elements()
da du faktisk ikke har brug for rækketypen (foo
) overhovedet i dette eksempel:
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 her
Men det er ikke hvad du bad om præcis:
Du returnerer alle JSON-array-elementer (0-n pr. basistabelrække), hvor en bestemt nøgle ('{payload,details,*,name}'
) matcher (der skelnes mellem store og små bogstaver).
Og dit oprindelige spørgsmål havde et indlejret JSON-array oveni dette. Du fjernede det ydre array for denne løsning - jeg gjorde det samme.
Afhængigt af dine faktiske krav kan new tekstsøgning af Postgres 10 kan være nyttigt.