Votre solution peut encore être simplifiée :
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%';
Ou plus simple, encore, avec jsonb_array_elements()
puisque vous n'avez pas réellement besoin du type de ligne (foo
) du tout dans cet exemple :
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 ici
Mais ce n'est pas ce que vous avez demandé exactement :
Vous renvoyez tous les éléments du tableau JSON (0-n par ligne de table de base), où une clé particulière ('{payload,details,*,name}'
) correspond (sensible à la casse).
Et votre question d'origine avait un tableau JSON imbriqué en plus de cela. Vous avez supprimé le tableau externe pour cette solution ; j'ai fait de même.
En fonction de vos besoins réels, la nouvelle capacité de recherche de texte de Postgres 10 pourrait être utile.