sql >> Databáze >  >> RDS >> PostgreSQL

Složený dotaz na pole JSONB v Postgresu?

Měli byste rozdělit pole nejvyšší úrovně a zkontrolovat prvky odtud:

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;

Pokud jde o nejlepší způsob, jak toho dosáhnout, závisí to hodně na vašich skutečných datech – kolik řádků, jak velké jsou tyto struktury jsonb atd. Obecně však platí, že vyhledávání jako ilike „%3%“ bude těžit z indexů založených z pg_trgm, protože nemohou používat tradiční indexy btree.

Edit:Dotaz @Abelisto v komentářích je lepší, protože by měl být výkonnější, zvláště pokud obsah může obsahovat 1000 prvků:

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. 2 způsoby, jak zjistit, zda se v instanci serveru SQL Server stále používají zastaralé funkce

  2. Varování:mysqli_error() očekává přesně 1 parametr, zadaná 0

  3. Existuje způsob, jak může PHP ověřit syntaxi SQL bez jejího provedení?

  4. Znáte časové pásmo datetime do řetězce?