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

Sammensat JSONB-array-forespørgsel i Postgres?

Du bør opdele arrays på øverste niveau og kontrollere elementerne derfra:

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;

Hvad angår den bedste måde at gøre dette på, afhænger det meget af dine faktiske data - hvor mange rækker, hvor store disse jsonb-strukturer er osv. Generelt vil en søgning som ilike '%3%' dog drage fordel af indeksbaserede off af pg_trgm, fordi de ikke kan bruge traditionelle btree-indekser.

Edit:@Abelistos forespørgsel i kommentarerne er bedre, fordi den burde være mere effektiv, især hvis indhold kan indeholde 1000-vis af elementer:

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. Søgeordssøgning og rangeringsresultat

  2. Mangler du hukommelse, når du laver en stor forespørgsel?

  3. Migrering af en Oracle MERGE-sætning til en PostgreSQL UPSERT-sætning

  4. Hvordan flytter du en opdelt tabel fra et tablespace til et andet i Oracle 11g?