PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

jsonb LIKE query su oggetti nidificati in un array

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.