Su solución se puede simplificar un poco más:
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 más simple, aún, con jsonb_array_elements()
ya que en realidad no necesita el tipo de fila (foo
) en absoluto en este ejemplo:
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 aquí
Pero eso es no lo que pediste exactamente:
Está devolviendo todos los elementos de la matriz JSON (0-n por fila de la tabla base), donde una clave en particular ('{payload,details,*,name}'
) coincide (se distingue entre mayúsculas y minúsculas).
Y su pregunta original tenía una matriz JSON anidada además de esto. Eliminaste la matriz externa para esta solución; yo hice lo mismo.
Dependiendo de sus requisitos reales, la nueva capacidad de búsqueda de texto de Postgres 10 podría ser útil.