PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

jsonb LIKE Abfrage auf verschachtelte Objekte in einem Array

Ihre Lösung kann noch weiter vereinfacht werden:

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%';

Oder noch einfacher mit jsonb_array_elements() da Sie den Zeilentyp eigentlich nicht benötigen (foo ) überhaupt in diesem Beispiel:

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 hier

Aber das ist nicht was Sie gefragt haben genau:

Sie geben alle JSON-Array-Elemente (0-n pro Basistabellenzeile) zurück, wobei ein bestimmter Schlüssel ('{payload,details,*,name}' ) Übereinstimmungen (Groß-/Kleinschreibung beachten).

Und Ihre ursprüngliche Frage hatte darüber hinaus ein verschachteltes JSON-Array. Sie haben das äußere Array für diese Lösung entfernt - ich habe dasselbe getan.

Abhängig von Ihren tatsächlichen Anforderungen die neue Textsuchfunktion von Postgres 10 könnte nützlich sein.