Non ci sono jsonb
integrati né operatori né indici che supportano direttamente (ancora) questo tipo di filtro.
Suggerisco un EXISTS
semi-unirsi:
SELECT t.*
FROM tbl t
WHERE EXISTS (
SELECT FROM jsonb_array_elements(t.jsoncol) elem
WHERE elem->>'value' LIKE '%ba%'
);
Evita valutazioni ridondanti e il DISTINCT
finale passo dovresti ottenere righe distinte con un semplice CROSS JOIN
.
Se questo non è ancora abbastanza veloce, una soluzione specializzata molto più sofisticata per un determinato tipo di query sarebbe quella di estrarre una stringa concatenata di valori univoci (con un delimitatore che non interferirà con i tuoi modelli di ricerca) per riga in un IMMUTABLE
funzione, costruisci un indice GIN del trigramma sull'espressione funzionale e usa la stessa espressione nelle tue query.
Correlati:
- Cerca i valori nidificati nell'array jsonb con l'operatore maggiore
- Trova le righe contenenti una chiave in un array di record JSONB
- Crea l'indice JSONB di Postgres su un sottooggetto array
A parte, se il tuo jsonb
i valori assomigliano davvero all'esempio, puoi tagliare molto rumore e archiviare semplicemente:
[
{"foo":"bar"},
{"biz":"baz"},
{"beep":"boop"}
]