PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Cerca in un array JSON un oggetto contenente un valore che corrisponde a un pattern

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