sql >> Database >  >> RDS >> PostgreSQL

Samengestelde JSONB-arrayquery in Postgres?

Je moet de arrays op het hoogste niveau uit elkaar halen en de elementen vanaf daar controleren:

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;

Wat de beste manier is om dit te doen, dat hangt sterk af van uw werkelijke gegevens - hoeveel rijen, hoe groot deze jsonb-structuren zijn, enz. In het algemeen zal een zoekopdracht zoals ilike '%3%' echter profiteren van op indexen gebaseerde off van pg_trgm omdat ze geen traditionele btree-indexen kunnen gebruiken.

Bewerken:de vraag van @Abelisto in de opmerkingen is beter omdat deze beter zou moeten presteren, vooral als de inhoud duizenden elementen kan bevatten:

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


  1. SQL-query die een attribuut in meerdere tupels vergelijkt op basis van waarden van een ander attribuut binnen de relatie

  2. MySQL hoe kap je een tabel af in een opgeslagen procedure?

  3. Kan oracle.jdbc.driver.OracleDriver . niet vinden of laden

  4. MySQL gebruikt filesort op geïndexeerde TIMESTAMP-kolom