Solusi Anda dapat disederhanakan lagi:
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%';
Atau lebih sederhana lagi, dengan jsonb_array_elements()
karena Anda sebenarnya tidak memerlukan jenis baris (foo
) sama sekali dalam contoh ini:
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 di sini
Tapi itu tidak apa yang Anda tanyakan tepatnya:
Anda mengembalikan semua elemen array JSON (0-n per baris tabel dasar), di mana satu kunci tertentu ('{payload,details,*,name}'
) cocok (peka huruf besar/kecil).
Dan pertanyaan awal Anda memiliki array JSON bersarang di atas ini. Anda menghapus larik luar untuk solusi ini - saya melakukan hal yang sama.
Bergantung pada kebutuhan Anda yang sebenarnya, kemampuan pencarian teks baru dari Postgres 10 semoga bermanfaat.