PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Pesquisar uma matriz JSON para um objeto contendo um valor que corresponda a um padrão


Não há jsonb embutido operadores nem quaisquer índices que suportem esse tipo de filtro diretamente (ainda).

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

Evita avaliações redundantes e o DISTINCT final passo, você precisaria obter linhas distintas com um simples CROSS JOIN .

Se isso ainda não for rápido o suficiente, uma solução especializada muito mais sofisticada para um determinado tipo de consulta seria extrair uma string concatenada de valores únicos (com um delimitador que não interfira em seus padrões de pesquisa) por linha em um IMMUTABLE função, construa um índice GIN de trigrama na expressão funcional e use a mesma expressão em suas consultas.

Relacionado:
  • Pesquisar valores aninhados na matriz jsonb com operador maior
  • Encontre linhas contendo uma chave em uma matriz de registros JSONB
  • Criar índice JSONB do Postgres no subobjeto da matriz

Além disso, se o seu jsonb os valores realmente se parecem com o exemplo, você pode cortar muito ruído e apenas armazenar:
[
   {"foo":"bar"},
   {"biz":"baz"},
   {"beep":"boop"}
]