PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Zusammengesetzte JSONB-Array-Abfrage in Postgres?

Sie sollten die Arrays der obersten Ebene aufteilen und die Elemente von dort aus überprüfen:

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;

Wie Sie dies am besten tun, hängt stark von Ihren tatsächlichen Daten ab - wie viele Zeilen, wie groß diese jsonb-Strukturen sind usw. Im Allgemeinen profitiert eine Suche wie "%3%" jedoch von Indizes weg von pg_trgm, da sie keine traditionellen btree-Indizes verwenden können.

Bearbeiten:Die Abfrage von @Abelisto in den Kommentaren ist besser, da sie leistungsfähiger sein sollte, insbesondere wenn der Inhalt Tausende von Elementen enthalten kann:

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