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.