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