PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

requête jsonb LIKE sur des objets imbriqués dans un tableau

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.