sql >> Base de Datos >  >> RDS >> PostgreSQL

jsonb LIKE consulta sobre objetos anidados en una matriz

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.