sql >> Databasteknik >  >> RDS >> PostgreSQL

Sammansatt JSONB-arrayfråga i Postgres?

Du bör dela isär toppnivåmatriserna och kontrollera elementen därifrån:

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;

När det gäller det bästa sättet att göra detta beror det mycket på dina faktiska data - hur många rader, hur stora dessa jsonb-strukturer är, etc. I allmänhet kommer dock en sökning som ilike '%3%' att dra nytta av indexbaserade av pg_trgm eftersom de inte kan använda traditionella btree-index.

Edit:@Abelistos fråga i kommentarerna är bättre eftersom den borde vara mer presterande, speciellt om innehåll kan innehålla 1000-tals element:

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. R:[unixODBC][Driver Manager]Kan inte öppna lib 'SQL Server':filen hittades inte

  2. bryggtjänster:var redigerar man konfigurationen?

  3. Pgbackrest återställ tidsmål

  4. Hur man använder kommandon som DROP TABLE etc. inom en lagrad procedur