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"}
]