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

Busque en una matriz JSON un objeto que contenga un valor que coincida con un patrón

No hay jsonb incorporados operadores ni ningún índice que admita este tipo de filtro directamente (todavía).

Sugiero un EXISTS semi-unión:

SELECT t.*
FROM   tbl t
WHERE  EXISTS (
   SELECT FROM jsonb_array_elements(t.jsoncol) elem
   WHERE  elem->>'value' LIKE '%ba%'
   );

Evita evaluaciones redundantes y el final DISTINCT paso, necesitaría obtener filas distintas con un simple CROSS JOIN .

Si esto aún no es lo suficientemente rápido, una solución especializada mucho más sofisticada para el tipo de consulta dado sería extraer una cadena concatenada de valores únicos (con un delimitador que no interfiera con sus patrones de búsqueda) por fila en un IMMUTABLE función, cree un índice GIN de trigrama en la expresión funcional y use la misma expresión en sus consultas.

Relacionado:

  • Buscar valores anidados en la matriz jsonb con mayor operador
  • Encuentre filas que contengan una clave en una matriz de registros JSONB
  • Crear un índice JSONB de Postgres en un subobjeto de matriz

Aparte, si tu jsonb los valores realmente se parecen al ejemplo, podría recortar una gran cantidad de ruido y simplemente almacenar:

[
   {"foo":"bar"},
   {"biz":"baz"},
   {"beep":"boop"}
]