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

Query di matrice JSONB composita in Postgres?

Dovresti dividere gli array di livello superiore e controllare gli elementi da lì:

select distinct id, content
FROM test
JOIN lateral (
    select elems 
    FROM jsonb_array_elements(content) jae(elems)
) all_arrays ON TRUE
WHERE elems ->> 0 = 'first 1'
and elems ->> 1 ilike '%3%'
ORDER BY 1;

Per quanto riguarda il modo migliore per farlo, dipende molto dai tuoi dati effettivi:quante righe, quanto sono grandi queste strutture jsonb, ecc. In generale, tuttavia, una ricerca come '%3%' trarrà vantaggio da indici basati fuori di pg_trgm perché non possono utilizzare gli indici btree tradizionali.

Modifica:la query di @Abelisto nei commenti è migliore perché dovrebbe essere più performante, soprattutto se il contenuto può contenere migliaia di elementi:

select * from test 
where exists 
  (select 1 
   from jsonb_array_elements(content) jae(elems) 
   where elems ->> 0 = 'first 1' 
   and elems ->> 1 ilike '%3%'
  );