La tua soluzione può essere ulteriormente semplificata:
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%';
O ancora più semplice, con jsonb_array_elements()
poiché in realtà non hai bisogno del tipo di riga (foo
) in questo esempio:
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 qui
Ma questo è non quello che hai chiesto esattamente:
Stai restituendo tutti gli elementi dell'array JSON (0-n per riga della tabella di base), dove una chiave particolare ('{payload,details,*,name}'
) corrisponde (con distinzione tra maiuscole e minuscole).
E la tua domanda originale aveva un array JSON nidificato in cima a questo. Hai rimosso l'array esterno per questa soluzione - ho fatto lo stesso.
A seconda dei requisiti effettivi, la nuova funzionalità di ricerca del testo di Postgres 10 potrebbe essere utile.